public class TestJNI { // 定義 native 方法 private native void say(); static { // 加載動態庫 // 從當前路徑或 java.library.path 查找, 去掉文件擴展名, macos 須要去掉 lib 前綴 System.loadLibrary("TestJNI"); // 或者使用文件絕對路徑加載 // System.load( "/path/to/TestJNI.so"); } public static void main(String[] args) { new TestJNI().say(); } }
javah TestJNI
修改 TestJNI.h
中 #include <jni.h>
-> #include "jni.h"
這樣會優先從當前目錄尋找 jni.h
頭文件java
TestJNI.cpp
文件#include "TestJNI.h" JNIEXPORT void JNICALL Java_TestJNI_say (JNIEnv *env, jobject obj) { printf("hello world"); }
拷貝依賴的 JNI 相關頭文件到當前目錄, 或者使用 gcc 編譯時指定參數 -I $JAVA_HOME/include -I $JAVA_HOME/include/darwin
git
cp $JAVA_HOME/include/jni.h . cp $JAVA_HOME/include/darwin/jni_md.h .
編譯github
Linuxmacos
gcc -shared TestJNI.cpp -o TestJNI.so
MacOSbash
gcc -dynamiclib TestJNI.cpp -o libTestJNI.dylib -I $JAVA_HOME/include -I $JAVA_HOME/include/darwin
Windows測試
gcc -shared TestJNI.cpp -o TestJNI.dll -I $JAVA_HOME/include -I $JAVA_HOME/include/darwin
javac TestJNI.java java TestJNI
如何查看 java.library.path
地址.net
public class PrintJavaLibPath { public static void main(String[] args) { String[] split = System.getProperty("java.library.path").split(":"); for (String string : split) { System.out.println(string); } } }
https://github.com/kense-lab/...code