谁在Java中实现操作系统接口?

7

我的问题主要涉及标准,但对于特定实现如何处理此问题的意见也很受欢迎。所以,没有更多的话要说了,我的问题是:

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

此外,通常是通过Java本地接口实现的吗?

例如:我正在使用java.io.FileReader读取文件。当在该对象上调用read时,JVM显然会调用正确类文件中的此函数,在JCL中,但是,最终代码是否依赖于JVM进行调用,例如posix read函数?-还是类文件本身通过使用JNI这样做?(假设必须进行read,即文件尚未在高速缓存/内存中)

2个回答

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。这就是各个部分如何配合的。

实际上,JVM只提供通用的JNI功能,JCL使用它来调用C代码实现所有系统相关操作,对吗? - Skeen
这是否意味着,一个人可以实现一个JVM,然后从另一个JVM(针对相同平台)中借用JCL? - Skeen
第一个问题:是的,确实如此。第二个问题:理论上,这应该可以工作,是的。至少,我看不出为什么它不能工作。 - Jan Dörrenhaus
好的,我会接受你的答案,并对JNI领域进行一些研究。 - Skeen

0

回答你的核心问题,JVM负责操作系统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) { ... } 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接