JNI 使用教程

編寫 Java 測試類

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();
    }
}

利用 Java 類生成 C++ 頭文件

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");
}

編譯 C++ 代碼, 生成動態連接庫

  1. 拷貝依賴的 JNI 相關頭文件到當前目錄, 或者使用 gcc 編譯時指定參數 -I $JAVA_HOME/include -I $JAVA_HOME/include/darwingit

    cp $JAVA_HOME/include/jni.h .
    cp $JAVA_HOME/include/darwin/jni_md.h .
  2. 編譯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

編譯運行 Java Class

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

參考

相關文章
相關標籤/搜索