1

这些天我一直在阅读Java Native Interface。所以顺便说一下,我确实有疑问。举个例子,如果我们需要在Java程序中进行I/O操作,我们使用Java API进行I/O操作.此外,在低级别,它应该映射到操作系统级别的I/O处理。问题是Java API如何与主机操作系统中的本地I/O方法交互。

Short and Sweet,我听说JDK中的一些方法是本地实现的。这些本地方法是如何被Java API调用的。我猜应该是JNI(Java Native Interface)。

有人可以澄清我的疑问。

谢谢

努万阿兰巴奇

4

2 回答 2

3

Java 中的方法可以被标记native以表明它们的实现不是用 Java 或字节码编写的,而是依赖于平台的。例如,Java I/O 操作几乎总是作为native方法实现,以便它们可以利用机器上的底层硬件或操作系统接口。

无法保证native方法的实际实现方式。在 Sun(现在是 Oracle)的 JVM 实现中,您可以通过使用 JNI 定义与自定义库交互以与 Java 代码交互的特殊命名的 C 函数来编写本机方法的实现。但是,另一个 JVM 可以以完全不同的方式实现本机方法。事实上,现在我正在做一个用 JavaScript 实现 JVM 的项目,所以所有的本地方法都是用 JavaScript 而不是 C 实现的。

简而言之,没有native实现方法的“单一方式”。重点是为 JVM 和 Java 库实现提供最大的灵活性,因此行为的指定越少越好。

于 2011-02-25T10:14:47.843 回答
2

加载本机库后,将方法绑定(集成)到 JVM 中。Java VM 规范使用术语绑定而不是链接以避免混淆。但这只是措辞。

剩下的很简单。有一些字节码操作数用于调用方法。如果该消息被声明为native,则调用相关的本机代码。参数和结果被转换,因此如果我们调用本机或非本机方法,它不会产生影响。

看一下规格invokevirtual,项目符号列表涵盖了这种native情况。

于 2011-02-25T10:30:24.743 回答