在许多Java库类的代码中,我可以看到本机方法。即使在Object
类。
如果Java代码转换为字节代码时Java与平台无关,那么本机代码呢?它也被转换成字节码吗?
这个本机代码调用是否来自操作系统,还是来自下载或安装Java本身?
答案 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的本机代码编译器实现了一些“聪明的技巧”,以允许这种情况发生。