JNIヘッダファイル作成手順|Android開発
手順
- 呼び出す側のプログラム(宣言)をJavaで書きます。
サンプル
private final native int initializeJNIObject(long nativeObject);
- JavaのソースをAndroid Studioなどでコンパイルしてclassファイルを生成します。
- javah(※)を使ってclassファイルからC言語/C++のヘッダーファイルを生成します。
コマンド書式
javah -d 出力先ディレクトリ -classpath android.jar;クラスのあるディレクトリ クラス名
実行例
cd "C:\Program Files\Java\jdk1.8.0_111\bin"
>javah -force -d C:\temp -classpath C:\android-sdk-windows\platforms\android-22\android.jar;C:\MyApp\android-demo\app\build\intermediates\classes\debug com.moewenet.sample.MyClass
- 環境変数JAVA_HOME登録済みで、環境変数PATHに
%JAVA_HOME%\bin
登録済みなら、javah実行前のチェンジディレクトリは不要です。
Android Studio では-classpath
にターゲットのフォルダ指定が必要
上記サンプルで"android.jar;"より後ろの部分-classpath
のフォルダはpackage nameのフォルダより上を指定- クラス名はフルのpackage nameが必要
- 生成したヘッダーファイルの実装を.c/.cppで書きます。
※javac や java と同じディレクトリに入っています。
おまけ:Java側の記述
出力ファイル名
Android.mkに記述します。
LOCAL_MODULE := libmynative
呼び出し側
クラス内に以下を追加。 System.loadLibraryのパラメータlibNameは出力ファイル名から先頭の"lib"を省いたもの。
package com.moewenet.sample;
public class MyClass {
static {
try {
System.loadLibrary("mynative");
} catch (UnsatisfiedLinkError e) {
}
}
private final native int initializeJNIObject(long nativeObject);
}