谁在java中实现了OS接口?

时间:2013-08-26 20:16:31

标签: java interface java-native-interface standards standard-library

我的问题主要是关于标准,但是关于具体实现如何处理该问题的输入也是受欢迎的。所以没有进一步的重做,我的问题是;

  • 谁负责Java中的操作系统接口?
    • Java虚拟机?
    • 或Java类库?

这通常如何通过Java Native Interface实现?

实施例;我正在使用java.io.FileReader读取文件。当在这个对象上调用read时,JVM显然会在JCL中的正确类文件中调用此函数,但是这段代码最终会依赖于JVM进行调用,例如posix {{1}功能? - 或者类文件是否会通过使用JNI自行完成? (假设必须完成read,即文件不在缓存/内存中)

2 个答案:

答案 0 :(得分:1)

我希望有一些真正的专业人士会回答这个问题,最好是那些真正从事JVM / JDK工作的人。到目前为止,他们似乎都没有上网(或者已经看过你的问题),我将解释这个问题。

Java类库类(位于JRE / JDK的rt.jar文件中)实际上是纯Java。但它们确实包含了大量的JNI调用。例如,如果你查看FileInputStream的来源,你会发现这样的东西:

private native int readBytes(byte b[], int off, int len)
    throws IOException;

public int read(byte b[])
    throws IOException
{
    return readBytes(b, 0, b.length);
}

所以你的猜测是正确的:JCL确实广泛使用JNI。但谁提供这些原生实现?简单:JVM。这就是各个部分的结合方式。

答案 1 :(得分:0)

为了回答您的核心问题,JVM负责OS shell集成。 Java类库(API)是一组使用JVM的功能,这就是它也被称为API的原因。

关于JNI集成,JVM正在处理这些调用。在类级别,您必须声明具有本机实现的代码。

我们以System.arraycopy()方法为例。此方法具有本机实现。 System类定义方法的签名,JVM负责将调用从System.arraycopy()方法转换为本机底层实现。如果从here下载OpenJDK源,则可以检查此.cpp文件 hotspot \ src \ share \ vm \ oops \ _ objArrayKlass.cpp

void objArrayKlass::copy_array(arrayOop s, int src_pos, arrayOop d,
                       int dst_pos, int length, TRAPS) { ... }