本机混合Java代码如何与平台无关?

时间:2013-11-28 09:13:58

标签: java operating-system

在许多Java库类的代码中,我可以看到本机方法。即使在Object类。

如果Java代码转换为字节代码时Java与平台无关,那么本机代码呢?它也被转换成字节码吗?

这个本机代码调用是否来自操作系统,还是来自下载或安装Java本身?

2 个答案:

答案 0 :(得分:2)

Java库代码确实进行本机调用。现在这些调用由JVM完成。如果您注意到每个系统都有特定于操作系统的JVM,那么所有依赖于系统的本机调用最终都由系统相关的JVM实现提供。

答案 1 :(得分:0)

native方法有不同的风格:

  • 标准Java库中的本机方法将由您运行的平台(由Oracle和/或Java实现的供应商)实现。这样做是为平台开发Java的过程的一部分。当您使用Java(在该平台上)时,移植工作已经完成。 (这些方法是通过JVM及其相关的本机代码库/ dll实现的。)

  • 代码或第三方库中的本机方法是另一回事。实现这些方法的本机代码确实代表了可移植性障碍,因为它需要(至少)为每个平台重新编译。在很多情况下,移植过程甚至可能完全重写(本机)代码。


  

如果Java代码转换为字节代码时Java与平台无关,那么本机代码呢?它也被转换成字节码吗?

没有 1 。本机方法以其他一些编程语言实现;例如C或C ++。

(如果本机方法可以转换为字节码,那么首先就不需要将它们写成“本机”!)

  

这个本机代码调用是否来自操作系统,还是来自下载或安装Java本身?

Java本机方法不太可能直接映射到系统调用或调用标准OS提供的库之一。本机方法通常由JVM实现或客户或第三方本机库实现。见上文。


1 - 实际上,有一个例外。在JNode平台上,Java核心库中标记为native的大多数方法实际上都映射回Java代码。但那是因为,几乎整个JNode操作系统都是用Java实现的。 JNode的本机代码编译器实现了一些“聪明的技巧”,以允许这种情况发生。