一、JNI介紹
Java 本機介面(Java Native Interface (JNI))是一個本機編程介面,它是 Java 軟體開發工具箱(Java SoftwareDevelopment Kit (SDK))的一部分,JNI它提供了若干的API,實現了和Java和其他語言的通訊(主要是C&C++)。
JNI允許Java代碼使用以其它語言(譬如 C 和 C++)編寫的代碼和程式碼程式庫。
Invocation API(JNI的一部分)可以用來將Java虛擬機器(JVM)嵌入到本機應用程式中,從而允許程式員從機器碼內部調用Java 代碼。
也許不少人覺得Java已經足夠強大,為什麼要需要JNI這種東西呢?
我們知道Java是一種平台無關性的語言,平台對於上層的java代碼來說是透明的,所以在多數時間我們是不需要JNI的,但是假如你遇到了如下的三種情況之一呢?
1. 你的Java代碼,需要得到一個檔案的屬性。但是你找遍了JDK協助文檔也找不到相關的API。
2. 在本地還有一個別的系統,不過他不是Java語言實現的,這個時候你的老闆要求你把兩套系統整合到一起。
3. 你的Java代碼中需要用到某種演算法,不過演算法是用C實現並封裝在動態連結程式庫檔案(DLL)當中的。
對於上述的三種情況,如果沒有JNI的話,那就會變得異常棘手了。就算找到解決方案了,也是費時費力。其實說到底還是會增加開發和維護的成本。
二、環境需求
JNI 最常見的兩個應用:從Java程式調用C/C++,以及從C/C++程式調用Java代碼
1、需要下列工具與組件:
javac.exe: Java 編譯器:隨 SDK(Java 2 SDK及以上) 一起提供的 。
java.exe: JAVA 虛擬機器(JVM):隨 SDK 一起提供的 。
javah.exe: 本機方法 C 檔案產生器:隨 SDK 一起提供的 。
2、定義JNI的庫檔案和本機標頭檔:
jni.h (C 標頭檔)、jvm.lib 和 jvm.dll (window下)或 libjvm.so 檔案(linux下),這些檔案都是隨 SDK 一起提供的。
3、能夠建立共用庫的 C 和 C++ 編譯器。
最常見的兩個 C 編譯器是用於Windows的Visual C++和用於基於UNIX系統的 gcc/cc。
因此,後面我們將會介紹在兩種環境下的JNI編程例子。