2009_0221OSAKA_JNI_sugimoto

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の自社端末開発中
■広報
次はかっこいい端末を作りたい
のでオープンハードウェアで協
力者募集!(予定)
ありがとうございました