JavaをCで拡張するJNIに挑戦してみた

Javaクラスを作成

public class Sample {
    static {
        System.loadLibrary("SampleJNI");
    }

    public native String say();

    public static void main(String[] args) {
        System.out.println(new Sample().say());
    }
}

作成後は普通にコンパイル

ヘッダーファイルを生成する

javah -jni Sample

実行するとSample.hが生成される

C(C++)のソースを作成

#include "Sample.h"

JNIEXPORT jstring JNICALL Java_Sample_say(JNIEnv *env, jobject obj) {
    return env->NewStringUTF("Hello World!!");
}

コンパイル

以下を実行してコンパイル

gcc -fPIC -I/path/to/java/include -I/path/to/java/include/linux -g -c SampleJNI.cpp

んで以下のコマンドを実行して共有ライブラリ形式にする

gcc -shared -lstdc++ -o libSampleJNI.so SampleJNI.o

実行する際には生成した共有ライブラリのパスをLD_LIBRARY_PATHに追加してから実行する

※-lstdc++省くとundefined symbol: __gxx_personality_v0というエラーが発生する