こちら を試してみました。
上手くいかなかった点は修正で。
NativeClass.java
1 2 3 |
public class NativeClass { public native void nativeMethod(); } |
コンパイル
1 |
$ javac NativeClass.java |
ヘッダーファイル生成
1 |
$ javah -jni NativeClass |
Native.c
1 2 3 4 5 6 |
#include <stdio.h> #include "NativeClass.h" JNIEXPORT void JNICALL Java_NativeClass_nativeMethod (JNIEnv* env, jobject thisObj) { printf("Hello World!!\n"); } |
Nativeメソッドを実装したCコードのコンパイル
1 |
$ gcc -I /opt/jdk1.8.0_212/include -I /opt/jdk1.8.0_212/include/linux -shared -fPIC -o libNative.so Native.c |
「-fPIC」が無いと
/tmp/ccdodAWp.o: could not read symbols: Bad value
collect2: ld はステータス 1 で終了しました
となってしまいました。
Hello.java
1 2 3 4 5 6 7 |
public class Hello { public static void main(String[] args) { System.loadLibrary("Native"); NativeClass nativeClass = new NativeClass(); nativeClass.nativeMethod(); } } |
コンパイル
1 |
$ javac Hello.java |
出来上がったもの
1 2 3 |
$ ls NativeClass.java NativeClass.class NativeClass.h Native.c libNative.so Hello.java Hello.class |
ライブラリにコピーしてパス調整
1 2 |
$ cp -f libNative.so /usr/local/lib $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib |
実行
1 2 |
$ java Hello Hello World!! |