JEP 419:JDK18將無需JNI呼叫JVM外部程式和資料

banq發表於2021-11-16

外部函式和記憶體 API 是由JEP 412提出的,該API能使Java程式無需JNI直接能夠呼叫本地庫和處理本地資料。
根據Java 17中反饋進行了改進,並在 Java 18 中重新推出孵化 API。
目標
  • 易用性— 用高階的純 Java 開發模型替換 Java 本機介面 ( JNI )。
  • 效能 — 提供與JNI和sun.misc.Unsafe等現有API相當的效能
  • 通用性— 提供對不同型別的外部記憶體(例如,本機記憶體、持久記憶體和託管堆記憶體)進行操作的方法,並且隨著時間的推移,以適應其他平臺(例如,32 位 x86)和用其他語言編寫的外部函式比 C(例如,C++、Fortran)。
  • 安全——預設禁用不安全的操作,只有在應用程式開發人員或終端使用者明確選擇後才允許它們。

多年來,出現了許多框架來填補 JNI 留下的空白,包括JNAJNRJavaCPP。雖然這些框架通常比 JNI 有了顯著的改進,但情況仍然不太理想,尤其是與提供一流的本地互操作的語言相比時。例如,Python 的ctypes包可以在本地庫中動態包裝函式,無需任何膠水程式碼。其他語言,例如Rust,提供了從 C/C++ 標頭檔案機械地派生本機包裝器的工具。
最終,Java 開發人員應該有一個受支援的 API,讓他們可以直接使用任何被認為對特定任務有用的本地庫,而沒有 JNI 的繁瑣和笨拙。

相關文章