JNIヘッダファイル作成手順|Android開発

      2018/06/14

手順

  • 呼び出す側のプログラム(宣言)を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);
}

 - Android