在JDK中大量使用本机方法吗?

时间:2015-02-02 01:49:02

标签: java java-native-interface

以下是SocketException的堆栈提示:

java.net.SocketException: Network is unreachable
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)

我注意到PalinSocketImple.socketConnect是一种原生方法。如果我没记错的话,read()的{​​{1}}方法也是以原生的方式实现的。本机方法的执行需要大量的数据类型转换,这可能会成为性能问题(我猜)。所有方法最终都以本机方式实现(调用本机方法)。这是对的吗?

3 个答案:

答案 0 :(得分:1)

完全有可能编写程序而无需从主用户或任何其他用户创建的线程调用本机代码。问题是它不是一个非常有用的程序。 JVM就是虚拟机。它将程序与底层操作系统隔离开来,以提供平台独立性。本机方法提供对运行代码的虚拟机外部的资源的访问。

与操作系统的所有交互都必须在本机代码中进行,因为Java代码不可能直接与操作系统交互。这包括IO,图形,甚至是读取当前时间。所以,是的,如果您的程序在虚拟机之外进行任何类型的交互,那么它通过本机代码完成。

答案 1 :(得分:1)

  

所有方法最终都以本机方式实现(调用本机方法)。这是对的吗?

没有。调用操作系统的所有方法最终都是本机实现的,还有一些依赖外部库的方法,如java.util.zip classes.

答案 2 :(得分:1)

  

本机方法的执行需要大量的数据类型转换,这可能会成为性能问题(我猜)。

这不是主要原因。主要原因是大多数核心本机方法都是通过系统调用与操作系统交互的包装器,这些方法通常涉及硬指针和C风格的结构。使用粗糙的低级API(类似于Unsafe)进行此类操作并非不可能,但它更适合用C或C ++进行系统调用。

  

所有方法最终都以本机方式实现(调用本机方法)。这是对的吗?

绝对不是。大多数Java方法都是纯字节码,并且JIT编译成本机代码......使用JNI / JNA /看不到任何“本机”方法。