本家フォーラムにちょっと興味深いネタが。
Registering a java method as a callback function - android-ndk | Google Groups
NativeからJavaのメソッドをコールバックで呼びたいんだけど...という質問。
そのレスの一つが
Use a native method to create the pipe and return the read end to the Java side, and that should be it.
JavaとNativeプロセスの間をパイプを使ってやったらどう?ってことらしい。
ああ、Javaってパイプ開けるのね...と思うと同時に、JNI使わなくてもNativeとやりとりしても(Android的に)いいんだろうか?という疑問が沸いた。
こないだリリースされたNDKでもJNI経由が前提っぽいし、今の時点ではオフィシャルにはNativeはJNI経由でということなんだと思う。
ただ、Androidのソースを見ているとJavaからsocketを使ってNativeとやり取りしている場所がある。
mydroid/frameworks/base/services/java/com/android/server/MountListener.java の中で、Nativeプロセスの"vold"に対してsocketを使っている。
おそらく、SDカードのマウント状態を監視している(と思われる)Nativeのvoldプロセスと、UI上やアプリへのintentでSDの抜き差しなどを通知しないといけないJava側のMountServiceとでいろいろやり取りしてるんだと思う。
...で、この方法、使って良いのかな?
もちろん、公式アナウンスが無いから表向きは「ダメ」なんだろうけど。今後SDKやNDKのバージョンアップとともに解禁になったりするのかな。対象デバイス固定の専用アプリなんかでは、どう実装しようが自由と言えば自由なんだろうけどね。
個人的にはframework部分も早くNDKで正式サポートして欲しい。気になる機能がたくさんあるし。
コメント