最近學習 JNI,先把目前的理解 Note 下來,後面再慢慢修改,如果不對的地方,請指出,3Q
JNI 介紹就不說了,直接進入應用方法,這裏說的是 Java 引用 C++ 接口:(目前看到兩種)
這裏只 Note :從 Java 需要的接口,到 C++ 生成相應的 .so 的過程。
1.這第一種方法最大的特點是:C++的函數名由 Java 的文件編譯決定,而且 C++ 文件要引用 Java 生成的 .h 文件。
這種方法在 Windows 和 Linux 中都有看到(因爲第二種方法,現在只在 Linux 中看到使用,還沒驗證 Win32 上的情況),過程爲:
生成 .so 的過程:
(1) 先把 Java 需要調用的接口在 .java 文件裏寫出來。函數使用 native 關鍵字
如 public native static void set(int i); 後面應用時,Java 程序調用 C++ 的功能就是通過這個接口。
(2) 調用 javac 命令,編譯這個文件生成 class, 然後調用 javah 命令,生成 .h 文件。
這個文件裏定義了 C++ 中與 .java 中接口 set 對應的函數的函數名,以及參數。如下:
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);
(3) 下面要做的就是編寫 .cpp 實現 這個 .h 文件中的接口。然後編程生成 .so
2.第二種方法的特點是:實現功能的 C++ 函數名可以任意定義,只要把它與 Java 的接口一一對應就可以,當然這樣 Java 也就不需要生成 .h 供 C++ 來應用了(目前這種方法只在 Linux 上看到,Win32 上沒驗證)。下面就進入過程說明(生成 .so 的過程全在 C++ 中,不要 Java 參與,只需要知道 Java 需要的接口函數就可以了):
(1)當然開始還是要 Java 寫出需要的