とりあえずHello
Javaからhelloを出力するネイティブコードを呼んでみる.
とにかくJavaからCの関数を呼んでみることで,基本を理解したい.JNIを使用する場合の大きな流れは以下のようになる.
- nativeメソッドを含むJavaプログラムを作成,コンパイル.
- 生成されたクラスファイルからヘッダファイルを作成.
- ヘッダファイルを参照してCプログラムを作成
- 作成したCプログラムから共有ライブラリを作成
まずnativeメソッドを含むJavaプログラムを作成する.ネイティブメソッドはnativeをつけて宣言するが,内容は定義はしない.
native static void printHello();別にstaticでなくてもよい.また,このクラスではライブラリをロードする必要がある.今回はstatic初期化ブロックでロードするが別の場所でもロードできる(もちろんnativeメソッドを呼ぶ前に).
static{
System.loadLibrary("Sample");
}
サンプルのJavaプログラムを以下に示す.
作成したJavaプログラムをコンパイルしてクラスファイルを作る.そしてそのクラスに対してjavahを実行すると,Cプログラムのためのヘッダファイルが生成される.
Cで実装すべき関数名はJavaソースでのメソッド名と同じではないことに注意.
javah Sample生成されたヘッダファイルを以下に示す.
JNIEXPORT void JNICALL Java_Sample_printHello
(JNIEnv *, jclass);
今は引数は気にしない(というかまだ調査していない).で,この関数を実装する.今回はprintfするだけ.
で作成したCのファイルから共有ライブラリを作成する.Javaのソースで
System.loadLibrary("Sample");
としたのでライブラリ名はlibSample.soである.
gcc -shared \ -I /usr/lib/j2sdk1.3/include -I /usr/lib/j2sdk1.3/include/linux/ \ Sample.c -o libSample.soあとはこのライブラリへのパスをLD_LIBRARY_PATHに設定して実行する.
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. java Sample無事helloと出力された.

