Androidソースコード公開後 のJNI 日本Androidの会 関西支部長 株式会社 ブリリアントサービス 代表取締役 杉本 礼彦 ■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\Ca mera.java 178行目 public native final void startPreview(); ■native methodの実体を持つC言 語ファイル \\frameworks\base\core\jni\android_hardware_Ca mera.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 dfunc(args, pResult, method, self); 85行目で発見された関数は 103行目で実行されてます。 ■nativeの実体は? nativeの予約語で宣言された実体 はネイティブ(C言語やC++で書か れた部分)にあるということです。 ■もちろんJNIを使って拡張した インターフェースはそのプラット フォームでしか動きません。 ■JNIの話 おしまい ■広報 技術評論社 SoftwareDesign 2009年3月号 記事が載りました。 ■広報 ・Androidの自社端末開発中 ■広報 次はかっこいい端末を作りたい のでオープンハードウェアで協 力者募集!(予定) ありがとうございました
© Copyright 2024 ExpyDoc