谁用java实现操作系统接口



我的问题主要是关于标准,但也欢迎输入具体实现如何处理这个问题。因此,如果不做进一步的重做,我的问题是;

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

此外,这通常是如何通过Java Native Interface实现的?

示例;我正在使用java.io.FileReader读取一个文件。当在这个对象上调用read时,JVM显然会在JCL中的正确类文件中调用这个函数,但是这个代码最终会依赖JVM来调用吗,例如posix read函数?-还是类文件会通过使用JNI自己完成这项工作?(假设必须执行read,即文件尚未在缓存/内存中)

我希望一些真正的专业人士能回答这个问题,最好是那些真正在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。这就是这些部分组合在一起的方式。

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

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

让我们以System.arraypy()方法为例。此方法具有本机实现。System类定义方法的签名,JVM负责将调用从System.arraypy()方法转换为本机底层实现。如果您从这里下载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) { ... } 

相关内容

  • 没有找到相关文章

最新更新