【问题标题】:How JVM call the native method in host environmentJVM如何在宿主环境中调用native方法
【发布时间】:2011-02-25 10:09:22
【问题描述】:

这几天我一直在阅读Java Native Interface。所以顺便说一下,我确实有疑问。举个例子,如果我们需要在Java程序中进行I/O操作,我们会为我练习Java API /O 操作。而且,在底层,它应该映射到 OS 级别的 I/O 处理。问题是 Java API 如何与宿主操作系统中的本地 I/O 方法交互。

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

有人可以澄清我的疑问吗?

谢谢

女娲阿兰巴奇

【问题讨论】:

    标签: java java-native-interface native-code native-methods


    【解决方案1】:

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

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

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

    【讨论】:

    • 你已经回答了所有问题
    • 我想在 Javascript 中查看 JVM 的结果代码 :)
    【解决方案2】:

    加载本地库后,方法被绑定(集成)到 JVM 中。 Java VM Spec 使用术语 binding 而不是 linking 以避免混淆。但这只是措辞。

    剩下的很简单。有一些字节码操作数用于调用方法。如果该消息被声明为 native,则调用相关的本地代码。参数和结果会被转换,这样无论我们调用原生方法还是非原生方法都不会产生影响。

    查看invokevirtual 的规范,项目符号列表涵盖了native 的情况。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    相关资源
    最近更新 更多