用 JNI 進行 Java 編程(1)

本教程是關於什麼的?

Java 本機接口(Java Native Interface (JNI))是一個本機編程接口,它是 Java 軟件開發工具箱(Java Software Development Kit (SDK))的一部分。JNI 容許 Java 代碼使用以其它語言(譬如 C 和 C++)編寫的代碼和代碼庫。Invocation API(JNI 的一部分)能夠用來將 Java 虛擬機(JVM)嵌入到本機應用程序中,從而容許程序員從本機代碼內部調用 Java 代碼。java

本教程涉及 JNI 最多見的兩個應用:從 Java 程序調用 C/C++,以及從 C/C++ 程序調用 Java 代碼。咱們將討論 Java 本機接口的這兩個基本部分以及可能出現的一些更高級的編程難題。程序員

我應該學習本教程嗎?

本教程將帶您去了解使用 Java 本機接口的全部步驟。您將學習如何從 Java 應用程序內部調用本機 C/C++ 代碼以及如何從本機 C/C++ 應用程序內部調用 Java 代碼。編程

全部示例都是使用 Java、C 和 C++ 代碼編寫的,並能夠移植到 Windows 和基於 UNIX 的平臺上。要徹底理解這些示例,您必須有一些 Java 語言編程經驗。此外,您還須要一些 C 或 C++ 編程經驗。嚴格來講,JNI 解決方案能夠分紅 Java 編程任務和 C/C++ 編程任務,由不一樣的程序員完成每項任務。然而,要徹底理解 JNI 是如何在兩種編程環境中工做的,您必須可以理解 Java 和 C/C++ 代碼。安全

咱們還將講述一些高級主題,包括本機方法的異常處理和多線程。要充分理解本教程,您應該熟悉 Java 平臺的安全性模型,並有一些多線程應用程序開發的經驗。多線程

這裏將關於高級主題 的節從較基本的按部就班 JNI 簡介中劃分出來。如今,初級 Java 程序員能夠先學習本教程的前兩部分,掌握以後再開始學習高級主題。jvm

請參閱參考資料,那裏有關於本文所提到的教程、文章和其它一些參考書目的清單。工具

工具與組件

要運行本教程中的示例,您須要下列工具與組件:學習

* Java 編譯器:隨 SDK 一塊兒提供的 javac.exe。開發工具

* Java 虛擬機(JVM):隨 SDK 一塊兒提供的 java.exe。線程

* 本機方法 C 文件生成器:隨 SDK 一塊兒提供的 javah.exe。

* 定義 JNI 的庫文件和本機頭文件。jni.h C 頭文件、jvm.lib 和 jvm.dll 或 jvm.so 文件,這些文件都是隨 SDK 一塊兒提供的。

* 可以建立共享庫的 C 和 C++ 編譯器。最多見的兩個 C 編譯器是用於 Windows 的 Visual C++ 和用於基於 UNIX 系統的gcc。

雖然您可使用本身喜歡的任何開發環境,但咱們將在本教程中使用示例是用隨 SDK 一塊兒提供的標準工具和組件編寫的。請參閱參考資料來下載 SDK、完整的源文件以及對於完成本教程不可缺乏的其它工具。本教程具體地解釋了 Sun 的 JNI 實現,該實現被認爲是 JNI 解決方案的標準。本教程中沒有討論其它 JNI 實現的詳細信息。

 

其它注意事項

在 Java 2 SDK 中,JVM 和運行時支持位於名爲 jvm.dll(Windows)或 libjvm.so(UNIX)的共享庫文件中。在 Java 1.1 JDK 中,JVM 和運行時支持位於名爲 javai.dll(Windows)或 libjava.so(UNIX)的共享庫文件中。版本 1.1 的共享庫包含運行時以及類庫的一些本機方法,但在版本 1.2 中已經不包含運行時,而且本機方法被放在 java.dll 和 libjava.so 中。對於如下 Java 代碼,這一變化很重要:

* 代碼是用非 JNI 本機方法編寫的(由於使用了 JDK 1.0 中舊的本機方法接口)

* 經過 JNI Invocation 接口使用了嵌入式 JVM

在兩種狀況下,在您的本機庫能與版本 1.2 一塊兒使用以前,都必須從新連接它們。注:這個變化應該不影響 JNI 程序員實現本機方法 ― 只有經過 Invocation API調用 JVM 的 JNI 代碼纔會受到影響。

若是使用隨 SDK/JDK 一塊兒提供的 jni.h 文件,則頭文件將使用 SDK/JDK 安裝目錄中的缺省 JVM(jvm.dll 或 libjvm.so)。支持 JNI 的 Java 平臺的任何實現都會這麼作,或容許您指定 JVM 共享庫;然而,完成這方面操做的細節可能會因具體 Java 平臺/JVM 實現而有所不一樣。實際上,許多 JVM 實現根本不支持 JNI。

相關文章
相關標籤/搜索