cでhelloworld
java側を用意
public class Hello { static{ System.out.println(java.library.path); System.loadLibrary("Hello"); } static native void printHello(); public static void main(String args[]){ printHello(); } }
javac Hello.java
C側を作成、ヘッダ作成
javah Hello
#include <jni.h> /* Header for class Hello */ #ifndef _Included_Hello #define _Included_Hello #ifdef __cplusplus extern "C" { #endif /* * Class: Hello * Method: printHello * Signature: ()V */ JNIEXPORT void JNICALL Java_Hello_printHello (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif
#include "Hello.h" #include <stdio.h> JNIEXPORT void JNICALL Java_Hello_printHello (JNIEnv *env, jclass obj) { printf("hello\n"); }
cをコンパイルするために含めるjniのヘッダーを入れるためjdkの場所を探す。
/usr/libexec/java_home -V
ライブラリ作成
gcc -shared -I/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/include/darwin Hello.c -o libHello.dylib
使うライブラリを実行時に指定して実行
java -Djava.library.path=. Hello
LD_LIBRARY_PATHに設定すると良い?