「Java」Linux 環境で JNI その1

Linux 環境で JNI を使ってみたので、その時もメモ。

手順は以下の感じでやった。
1. Java ソースの作成
2. ヘッダファイルの生成
3. C 側のソース作成
4. 共有ライブラリを作成


1. Java ソースの作成

class Hello {

  public native void hello();

  public static void main(String[] args) {
    System.loadLibrary("Hello");
    Hello inst = new Hello();
    inst.hello();
  }
}

作成したソースファイルは javac でコンパイルしておく。


2. ヘッダファイルの生成

javah Hello


3. C 側のソース作成

#include "Hello.h"

JNIEXPORT void JNICALL Java_Hello_hello(JNIEnv *env, jobject obj)
{
  printf("Hello !!\n");
}

Hello !! と表示するだけの簡単なプログラム。


4. 共有ライブラリを作成

gcc -shared -I /usr/local/java/jdk1.6.0_30/include/ -I /usr/local/java/jdk1.6.0_30/include/linux/ Hello.c -o libHello.so

jni.h と jni_md.h が必要みたいなので、"-I" オプションで $JAVA_HOME/include/ と
$JAVA_HOME/include/linux/ を指定する。


上記で準備は完了。後は、以下のコマンドで実行すると「Hello !!」と表示されるはず。

java -Djava.library.path=[ libHello.so の存在するディレクトリ ] Hello

"-Djava.library.path" で共有ライブラリ ( この場合 libHello.so ) のある場所を指定する。
※ ちなみに、環境変数 LD_LIBRARY_PATH で指定しておいてもうまくいく。

■ 環境情報
CentOS 6.2
Java SE 6 Update 30


今回は以上。

今度は、「引数渡す」、「C 側から戻り値がある」とかやってみたい。
あと、Windows 環境でも試してみたいと思う。