ファイヤープロジェクト
とりあえずHello
2003-07-20T15:13+09:00   matsu
Javaからhelloを出力するネイティブコードを呼んでみる.
とにかくJavaからCの関数を呼んでみることで,基本を理解したい.JNIを使用する場合の大きな流れは以下のようになる.
  1. nativeメソッドを含むJavaプログラムを作成,コンパイル.
  2. 生成されたクラスファイルからヘッダファイルを作成.
  3. ヘッダファイルを参照してCプログラムを作成
  4. 作成したCプログラムから共有ライブラリを作成
今回はHelloと表示するだけのnativeメソッドを呼ぶサンプルを作成する.
まずnativeメソッドを含むJavaプログラムを作成する.ネイティブメソッドはnativeをつけて宣言するが,内容は定義はしない.
native static void printHello();
別にstaticでなくてもよい.また,このクラスではライブラリをロードする必要がある.今回はstatic初期化ブロックでロードするが別の場所でもロードできる(もちろんnativeメソッドを呼ぶ前に).
static{
    System.loadLibrary("Sample");
}
サンプルのJavaプログラムを以下に示す.
作成したJavaプログラムをコンパイルしてクラスファイルを作る.そしてそのクラスに対してjavahを実行すると,Cプログラムのためのヘッダファイルが生成される.
javah Sample
生成されたヘッダファイルを以下に示す.
Cで実装すべき関数名はJavaソースでのメソッド名と同じではないことに注意.
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と出力された.
matsu(C)
Since 2002
Mail to matsu