Download - Android Hacks - Hack47
ANDROIDHACKS#47 アプリケーションから JNIを使う担当:かわらたん
Twitter : @pfkawara
Blog : http://kawara-tan.blogspot.com/
23/04/12
1
この資料について• この資料は下記の本をベースに勉強会で作成した資料です。
• 『 Android Hacks』(株式会社ブリリアントサービス著、オライリー・ジャパン刊)
• この本の紹介ページが下記にあります。
• http://www.oreilly.co.jp/books/9784873114569/
23/04/12
2
アジェンダ1. NDKで JNIを使用する
2. JNIメソッドを定義したアプリケーションを作成する
3. JNIライブラリを実装する
4. JNIライブラリをビルドする
5. Hackをさらに Hackする
※JNI・・・ Java Native Interfaceの略。 Javaと他言語 (大抵は C/C++)を連携するための仕組み
23/04/12
3
1. NDKで JNIを使用する
23/04/12
4
1. NDKで JNIを使用する• NDKを使用して JNIライブラリの実装を行うと、アプリケーション配布形式である apkファイルにネイティブライブラリとして同梱する事が出来る。
• ソースの配置場所
• アプリ: {NDK_HOME}/apps/sampleHack47• JNIライブラリ: {NDK_HOME}/apps/sampleHack47/project/jni
• 名前について
• JNIライブラリモジュール名はアプリのプロジェクト名と同じにする• Makeして出来るライブラリファイル名はプレフィックスに” lib”、拡張子は” .so”になる。例:プロジェクト名 (JNIライブラリモジュール名 )が” sample”ならば libsample.so
※拡張子の soは Shared Objectの略
23/04/12
5
2. JNIメソッドを定義したアプリケーションを作成する
23/04/12
6
2. JNIメソッドを定義したアプリケーションを作成する• Androidプロジェクトを Eclipseで作る
• 「新規 Androidプロジェクト」ダイアログの「ロケーション」で、あらかじめ決めたアプリの場所を選択する
• 先ほどの例で言うと、 {NDK_HOME}/apps/SampleHack47/projet
23/04/12
7
• MainActivity
2. JNIメソッドを定義したアプリケーションを作成する
23/04/12
8
Activityが初めて参照されたときに JNIライブラリを読み込む
Activityが初めて参照されたときに JNIライブラリを読み込む
JNIライブラリのメソッドを定義する (native修飾子をつけてJava以外でコンパイルされている事を示す )
JNIライブラリのメソッドを定義する (native修飾子をつけてJava以外でコンパイルされている事を示す )
3. JNIライブラリを実装する
23/04/12
9
3. JNIライブラリを実装する
• JNIヘッダ (ヘッダファイル )を作成
※クラスファイルからヘッダーファイルを作るので、 Javaソース (MainActivity)のコンパイルが済んでいる事が前提
• 生成されたヘッダファイルは以下
23/04/12
10
%> cd NDK_HOME/apps/SampleHack47/project%> javah –classpath bin –d jni sample.hack47.MainActivity%> cd NDK_HOME/apps/SampleHack47/project%> javah –classpath bin –d jni sample.hack47.MainActivity
3. JNIライブラリを実装する• ネイティブコードを C言語で実装
• JNIヘッダと同じディレクトリにソースを置く• JNIヘッダに宣言された JNI関数を実装する
23/04/12
11
3. JNIライブラリを実装する• Android.mkファイル作成
• JNIライブラリをビルドするためのmakeファイル(Android.mk)を Cのソースコードと同じディレクトリに作る
• ファイルの中身は以下
23/04/12
12
ライブラリモジュール名を指定ライブラリモジュール名を指定ソースファイルを指定ソースファイルを指定
my-dirマクロで現在のディレクトリを指定my-dirマクロで現在のディレクトリを指定
LOCAL_PATHを除く LOCAL_xxxの定義をクリーンアップLOCAL_PATHを除く LOCAL_xxxの定義をクリーンアップ
共有ライブラリを作成する際に指定共有ライブラリを作成する際に指定
4. JNIライブラリをビルドする
23/04/12
13
4. JNIライブラリをビルドする• makeコマンドでビルド
• appsディレクトリに配置されているプロジェクトを指定
• ビルドが完了すると、 SampleHack47/libs/armeabi/ の下にライブラリファイルが出来る
23/04/12
14
%> cd NDK_HOME%> make APP=SampleHack47%> cd NDK_HOME%> make APP=SampleHack47
5. Hackをさらに Hackする
23/04/12
15
5. Hackをさらに Hackする• ごめん。業務多忙のため、これ以上できませんでした
23/04/12
16
参考 URL• Android Developers
• http://developer.android.com/intl/ja/index.html• JNIメモ (Hishidama’s Java native interface Memo)
• http://www.ne.jp/asahi/hishidama/home/tech/java/jni.html• Android NDKで JNIを使用してアプリを高速可にするには
(@IT)
• http://www.atmarkit.co.jp/fsmart/articles/android15/android15_3.html
• ARMで使われる二つの ABI
• http://www.oidon.net/linux/arm-eabi-oabi
23/04/12
17