Androidソースコード公開後のJNI 株式会社 ブリリアントサービス 代表取締役 杉本 礼彦
■JNIはJavaとネイティブ(Javaより下の層、C言語やC++で書かれる)と連携する為に整備された仕組みです。
■なぜJNI? ・ネイティブに存在する資産を使えます。 ・速度が速い。 ・ネイティブに存在する資産を使えます。 ・速度が速い。 ・現在のAndroidに存在しないAPIを拡張するとなると必須の技術です。 ・ AndroidのパッケージもJNIで実現されている。
■ハンズオンと言いながらJNIの使い方は説明しません。 使い方の参考になる資料は 2009年1月19日 日本Androidの会の勉強会で JNIによるAndroid API拡張 株式会社GClue 佐々木さん
■ここではAndroidのパッケージのソースコードを例にJNIの仕組みについてお話します。 ソースコードを持っている方は一緒に見ていただけると良いと思います。
■native という予約語 abstractとの違い abstractもnativeも型のみ宣言(クラスやメソッドが実装されていない )と言う意味では同じだが、実体の場所が異なる。abstractは 派生クラスで実装。では native は?
■Androidのパッケージの場所 \\frameworks\base\core\java\android
■native methodを持つJavaファイル Cameraを例に見てみてみましょう。 native の説明にあった通りです。 \\frameworks\base\core\java\android\hardware\Camera.java 178行目 public native final void startPreview();
■native methodの実体を持つC言語ファイル \\frameworks\base\core\jni\android_hardware_Camera.cpp 311行目 status_t CameraService::Client::startPreview()
■Camera classのメソッドテーブル \\frameworks\base\core\jni\android_hardware_Camera.cpp 450行目(同じファイル) static JNINativeMethod camMethods[] = { { "startPreview", "()V", (void *)android_hardware_Camera_startPreview },
■メソッドをJNIに登録している箇所 \\frameworks\base\core\jni\android_hardware_Camera.cpp 538行目(同じファイル) // Register native functions return AndroidRuntime::registerNativeMethods(env, "android/hardware/Camera", camMethods, NELEM(camMethods));
■VMからJNIを使われるところ dalvik\vm\Native.c 65行目からの関数 void dvmResolveNativeMethod(const u4* args, JValue* pResult, const Method* method, Thread* self) func = dvmLookupInternalNativeMethod(method); ★85行目 ~ ~ ~ dfunc(args, pResult, method, self); ★103行目 return; } dvmLookupInternalNativeMethod 85行目で発見された関数は dfunc(args, pResult, method, self); 103行目で実行されてます。
■nativeの実体は? nativeの予約語で宣言された実体はネイティブ(C言語やC++で書かれた部分)にあるということです。
■もちろんJNIを使って拡張したインターフェースはそのプラットフォームでしか動きません。
■JNIの話 おしまい
■広報 技術評論社 SoftwareDesign 2009年3月号 記事が載りました。
■広報 ・Androidの自社端末開発中
■広報 次はかっこいい端末を作りたいのでオープンハードウェアで協力者募集!(予定)
ありがとうございました