JEP 419:JDK18将无需JNI调用JVM外部程序和数据

21-11-16 banq

外部函数和内存 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 的繁琐和笨拙。