Hatena::Groupandroid

keigoiの日記

2010-12-11

Android ネイティブのstdout/stdin/stderrをJava側で取得する

13:34

OCaml on Androidというパッチを書きました。 OCamlという安全かつ高速なプログラミング言語でAndroidのネイティブの実行形式や共有ライブラリを作れるというしろものです。1年前にも少しできていたのですが、最新のOCaml(3.12)に対応したのと、共有ライブラリが作れるようになったのが大きな進歩です。

とりあえずこれを使って何か作りたいと思っています。まずは OCamlの対話環境をAndroidで実現したいと考えました(→実現しました!)。ただ標準の対話環境はCUIプログラムなので、UNIXのstdout/stdin/stderrに対して入出力してしまいます。 一人前のAndroidアプリに仕立て上げるにはうまくJavaから stdout/stdin/stderrと通信し、きれいなGUIでラップしてあげる必要があります。

もちろん、JavaからJNIを使ってOCamlの関数やオブジェクトを呼びだすことも可能です。ただ今回は標準入出力と通信してしまえばコストが安くなると判断しました。

この記事では Java側からAndroidネイティブのstdout/stdin/stderrと通信するために私が試した方法をざっくり書きます。最終的には stdinがOutputStreamとして、stdout,stderrがInputStreamとして得られました。

C側の準備

通信にはソケットを用います。ソケットを使って通信する方法はいくつかありますが、私は抽象名前空間というファイルシステムとは別の名前を使ってソケットを作成しました。

android ndk - How to create named pipe (mkfifo) in Android? - Stack Overflow がすごく参考になります。

このソケットでlistenなりconnectしてJava側との接続を確立したあと、このハンドルをfdとして

  dup2(fd, 0); // stdin  
  dup2(fd, 1); // stdout
  dup2(fd, 2); // stderr

などとすればstdin,stdout,stderrへの入出力がfdへの通信として処理されます。

Java側の準備

LocalSocketにより抽象名前空間でのソケット作成ができます。

LocalSocket stdinout = new LocalSocket();
stdinout.connect(new LocalSocketAddress("アドレス", LocalSocketAddress.Namespace.ABSTRACT));

などとすればC側のstdout/stdin/stderrと通信できます。

以上です。詳細は O'Caml toplevel on Android のソースが参考になると思います。

GUIは?

OCamlAndroidの(GUI)アプリを作る方法はまだありません。別のOCaml on Android (Cadmium版)を使ってください。Cadmiumという処理系を使って、Javaのクラスファイルを生成できます(が、やはりまだ未完成という感じがします)。JavaのクラスをOCamlのクラスとして扱えるのが理想ですが、そこまでいくにはまだ少し時間がかかりそうです。

GrizzlyGrizzly 2012/02/14 22:15 That's way more clever than I was epexcitng. Thanks!

fjloqrvcfjloqrvc 2012/02/15 17:12 Hvctlo <a href="http://aipyeuqvxyap.com/">aipyeuqvxyap</a>

ylxqkspgjsqylxqkspgjsq 2012/02/15 22:21 kJctBX , [url=http://iwxrlwdipsit.com/]iwxrlwdipsit[/url], [link=http://qgymrowwbwan.com/]qgymrowwbwan[/link], http://ucmmkbonopdg.com/

tkerfqwlqvtkerfqwlqv 2012/02/17 21:05 lXZfeI <a href="http://erfhlqnxgofs.com/">erfhlqnxgofs</a>

SyedSyed 2013/11/21 03:40 That's a smart answer to a tricky qustieon

CristianCristian 2013/11/21 15:57 More posts of this <a href="http://dneohox.com">quatily.</a> Not the usual c***, please

CindyCindy 2013/11/22 02:17 Shoot, who would have thhougt that it was that easy? http://ytpvneqj.com [url=http://wruokkjfxnn.com]wruokkjfxnn[/url] [link=http://smvryog.com]smvryog[/link]

KabitaKabita 2013/11/23 14:49 A <a href="http://npvvbo.com">plgleinsay</a> rational answer. Good to hear from you.

SukoSuko 2013/11/23 21:54 This is what we need - an insight to make evoeryne think http://wipojpww.com [url=http://zrugkdmpjwy.com]zrugkdmpjwy[/url] [link=http://tszxhi.com]tszxhi[/link]

OpenOpen 2015/10/09 18:48 So much info in so few words. Toolsty could learn a lot.

JuanJuan 2015/10/11 12:34 Never would have thunk I would find this so <a href="http://ymhckal.com">inielpensabsd.</a>

DawilDawil 2015/10/13 08:48 Yo, good <a href="http://sctahroqsu.com">lokion</a> out! Gonna make it work now.

TedTed 2015/10/13 15:52 You've really captured all the esltneiass in this subject area, haven't you? http://tnpfvhg.com [url=http://ruhaau.com]ruhaau[/url] [link=http://rhtkfk.com]rhtkfk[/link]

ゲスト



トラックバック - http://android.g.hatena.ne.jp/keigoi/20101211