JNI 概述
从 JVM 的角度来看,有两种类型的代码: "Java™" 和 "本机"。 Java 本机接口 (JNI) 在两者之间建立了一个定义明确且与平台无关的接口。
本机代码可以通过两种不同的方式与 Java 一起使用: 作为正在运行的 JVM 中的 "本机方法" ,以及作为使用 "调用 API" 创建 JVM 的代码。 本节描述这两种方法之间的差别。
本机方法
Java 本机方法以 Java 声明,以另一种语言 (例如 C 或 C++) 实现,并由 JVM 根据需要装入。 要使用本机方法,您必须:
- 声明 Java 代码中的本机方法。
当 javac 编译器迂到 Java 源代码中的本机方法声明时,它会记录该方法的名称和参数。 由于 Java 源代码不包含实现,因此编译器会将该方法标记为 "本机"。 这样,在调用时,JVM 能够正确地解析该方法。
- 实现本机方法。
本机方法作为可装入的二进制库中的外部入口点来实现。 本机库的内容是特定于平台的。 JNI 提供为 JVM 提供了一种方法,以独立于平台的方式使用任何本机方法。
JVM 执行对本机方法的调用。 当 JVM 处于本机方法中时,JNI 提供一种方式来“回调”到 JVM。
- 装入针对要使用的 VM 的本机方法代码。
在声明本机方法时,您还必须在运行时查找并装入包含该方法的本机库。
两个 Java 接口装入本机库:
- java.lang.System.load()
- java.lang.System.loadLibrary()
通常,声明本机方法的类将本机库装入其静态初始化程序中。
Invocation API
创建 JVM 时将涉及本机代码。 JNI 中用于此目的的方面称为 JNI Invocation API。 要使用 Invocation API,请通过静态或动态方法绑定到特定于实现的共享库,并调用其导出的 JNI_* 函数。
JNI 规范和实现
JNI 规范在所选实现的详细信息方面并不明确。 它为简单且可扩展的 C 和 C++ 本机接口提供了一个可复用的框架。 JNI 模型还是 JVMTI 规范的基础。
Oracle Corporation 商标规范和 Java 兼容性包 (JCK) 确保符合规范但不符合实现。 本机代码必须符合该规范,但不符合实现要求。 针对未指定的行为编写的代码易于导致可移植性和向前兼容性问题。