AndroidでJavaとNativeとのやり取り(JNIは絶対必要?Socketなどは…?)

本家フォーラムにちょっと興味深いネタが。

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で正式サポートして欲しい。気になる機能がたくさんあるし。

タイトルとURLをコピーしました