2

来自IBM 链接:

JDK 1.0 版本包括一个较早的本机方法接口,该接口在本机代码和 Java 代码之间缺乏清晰的分离。在这个接口中,native 将直接进入 JVM 结构,因此无法跨 JVM 实现、平台甚至 JDK 版本进行移植。使用 JDK 1.0 模型升级具有大量本机的应用程序的成本很高,开发可以与多个 JVM 实现一起运行的本机也是如此。

本机意味着什么将直接进入 JVM 结构,因此不能跨 JVM 实现移植?我不明白这一点。

4

1 回答 1

5

当前 JNI的文档包含有关旧接口的有趣信息:

JDK 1.0 附带了一个本地方法接口。不幸的是,这个接口不适合其他 Java VM 采用有两个主要原因。

首先,本机代码将 Java 对象中的字段作为 C 结构的成员进行访问。但是,Java 语言规范没有定义对象在内存中的布局方式。如果 Java VM 在内存中以不同的方式布局对象,那么程序员将不得不重新编译本地方法库。

...

这意味着本机代码可以直接访问内存中对象的值,而不是通过一些 API。这相当于直接访问 Java 中的字段,而不是使用 getter/setter。这意味着在不破坏与使用旧本机接口的任何代码的兼容性的情况下,永远无法更改字段的底层布局。

我在这里找到了 JDK 1.0.2 的本机方法教程的副本。它包括一个关于从本机代码处理 Java 对象的部分。

现代 JNI 仅通过方法调用提供对 Java 对象字段的访问。这样,对象的布局和许多其他东西就可以在不破坏兼容性的情况下改变。

于 2012-05-16T05:59:27.627 回答