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

Java 本机方法在JDK中大量使用吗?,java,java-native-interface,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.AbstractPlain

下面是针对
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
是一种本地方法。如果我没记错的话,
InputStream
read()
方法也是用本机实现的。本机方法的执行需要大量的数据类型转换,这可能会成为性能问题(我猜)。所有方法最终都以本机方式实现(调用本机方法)。这是正确的吗?

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

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

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

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

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

这不是主要原因。主要原因是大多数核心本机方法都是通过系统调用与操作系统交互的包装器,这些方法通常涉及硬指针和C风格的结构。用GnalApple低级API(类似于Unaby)这样做是不可能的,但是在C或C++中建立SysCurice是更好的选择。 所有方法最终都以本机方式实现(调用本机方法)。对吗


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

InputStream的
read
方法是抽象的,而不是本机的。(您可能会想到FileInputStream?@immibis是对的。实现与I/O相关的方法的唯一方法是本机方法。这就是我想知道的一点,不可能太强烈了。这是可能的——例如参见JNode。但这并不是任何主流Java实现的工作方式。@StephenC我想说,JNode仍然适用。但在这种情况下,底层操作系统是实际机器,而不是另一个操作系统。您仍然需要本机代码来访问它的功能,因为您无法从VM中执行此操作。除非他们在本机代码注入中使用某种AOT/JIT编译。他们在本机代码编译器中做了一些聪明的事情。有一个低级的“不安全”库,编译器将不安全的“调用”转化为内联指令序列;e、 要访问内存位置,请注册I/O操作。因此,文件I/O、网络I/O最终都由本机实现method@Neo-如果您谈论的是JNode,那么就不是了。“不安全”本机代码实现的原语级别要低得多。所有与文件I/O和网络I/O有关的、高于“窥视”和“戳”设备寄存器级别的内容都是用Java实现的。