7

我的问题主要是关于标准的,但也欢迎就具体实现如何处理该问题提供意见。因此,无需进一步重做,我的问题是;

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

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

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

4

2 回答 2

1

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

Java 类库类(在rt.jar您的 JRE/JDK 文件中找到)实际上是纯 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。这就是这些碎片如何组合在一起的方式。

于 2013-08-26T21:36:30.817 回答
0

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

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

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