17
ANDROID HACKS #47 アアアアアアアアアア JNI アア アア アアアアア Twitter : @pfkawara Blog : http://kawara-tan.blogspot.com/ 22/06/20 1

Android Hacks - Hack47

Embed Size (px)

DESCRIPTION

「Android Hacks ―プロが教えるテクニック & ツール」(株式会社ブリリアントサービス 著)を教材とした勉強会でのまとめ資料です。http://www.oreilly.co.jp/books/9784873114569/

Citation preview

Page 1: Android Hacks - Hack47

ANDROIDHACKS#47 アプリケーションから JNIを使う担当:かわらたん

Twitter : @pfkawara

Blog : http://kawara-tan.blogspot.com/

23/04/12

1

Page 2: Android Hacks - Hack47

この資料について• この資料は下記の本をベースに勉強会で作成した資料です。

• 『 Android Hacks』(株式会社ブリリアントサービス著、オライリー・ジャパン刊)

• この本の紹介ページが下記にあります。

• http://www.oreilly.co.jp/books/9784873114569/

23/04/12

2

Page 3: Android Hacks - Hack47

アジェンダ1. NDKで JNIを使用する

2. JNIメソッドを定義したアプリケーションを作成する

3. JNIライブラリを実装する

4. JNIライブラリをビルドする

5. Hackをさらに Hackする

※JNI・・・ Java Native Interfaceの略。 Javaと他言語 (大抵は C/C++)を連携するための仕組み

23/04/12

3

Page 4: Android Hacks - Hack47

1. NDKで JNIを使用する

23/04/12

4

Page 5: Android Hacks - Hack47

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

Page 6: Android Hacks - Hack47

2. JNIメソッドを定義したアプリケーションを作成する

23/04/12

6

Page 7: Android Hacks - Hack47

2. JNIメソッドを定義したアプリケーションを作成する• Androidプロジェクトを Eclipseで作る

• 「新規 Androidプロジェクト」ダイアログの「ロケーション」で、あらかじめ決めたアプリの場所を選択する

• 先ほどの例で言うと、 {NDK_HOME}/apps/SampleHack47/projet

23/04/12

7

Page 8: Android Hacks - Hack47

• MainActivity

2. JNIメソッドを定義したアプリケーションを作成する

23/04/12

8

Activityが初めて参照されたときに JNIライブラリを読み込む

Activityが初めて参照されたときに JNIライブラリを読み込む

JNIライブラリのメソッドを定義する (native修飾子をつけてJava以外でコンパイルされている事を示す )

JNIライブラリのメソッドを定義する (native修飾子をつけてJava以外でコンパイルされている事を示す )

Page 9: Android Hacks - Hack47

3. JNIライブラリを実装する

23/04/12

9

Page 10: Android Hacks - Hack47

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

Page 11: Android Hacks - Hack47

3. JNIライブラリを実装する• ネイティブコードを C言語で実装

• JNIヘッダと同じディレクトリにソースを置く• JNIヘッダに宣言された JNI関数を実装する

23/04/12

11

Page 12: Android Hacks - Hack47

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の定義をクリーンアップ

共有ライブラリを作成する際に指定共有ライブラリを作成する際に指定

Page 13: Android Hacks - Hack47

4. JNIライブラリをビルドする

23/04/12

13

Page 14: Android Hacks - Hack47

4. JNIライブラリをビルドする• makeコマンドでビルド

• appsディレクトリに配置されているプロジェクトを指定

• ビルドが完了すると、 SampleHack47/libs/armeabi/ の下にライブラリファイルが出来る

23/04/12

14

%> cd NDK_HOME%> make APP=SampleHack47%> cd NDK_HOME%> make APP=SampleHack47

Page 15: Android Hacks - Hack47

5. Hackをさらに Hackする

23/04/12

15

Page 16: Android Hacks - Hack47

5. Hackをさらに Hackする• ごめん。業務多忙のため、これ以上できませんでした

23/04/12

16

Page 17: Android Hacks - Hack47

参考 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