谁用java实现操作系统接口?

谁用java实现操作系统接口?,java,interface,java-native-interface,standards,standard-library,Java,Interface,Java Native Interface,Standards,Standard Library,我的问题主要是关于标准的,但也欢迎您提供关于具体实现如何处理该问题的信息。因此,不必再重复,我的问题是 谁负责Java中的操作系统接口? Java虚拟机 还是Java类库 这通常是如何通过Java本机接口实现的 榜样;我正在使用java.io.FileReader读取一个文件。在这个对象上调用read时,JVM显然会在JCL的正确类文件中调用这个函数,但是这个代码最终会依赖JVM来调用,例如posixread函数吗或者类文件本身会通过使用JNI来实现这一点吗?(假设必须进行读取,即文件不

我的问题主要是关于标准的,但也欢迎您提供关于具体实现如何处理该问题的信息。因此,不必再重复,我的问题是

  • 谁负责Java中的操作系统接口?
    • Java虚拟机
    • 还是Java类库
这通常是如何通过Java本机接口实现的


榜样;我正在使用java.io.FileReader读取一个文件。在这个对象上调用
read
时,JVM显然会在JCL的正确类文件中调用这个函数,但是这个代码最终会依赖JVM来调用,例如posix
read
函数吗或者类文件本身会通过使用JNI来实现这一点吗?(假设必须进行
读取
,即文件不在缓存/内存中)

我希望一些真正的专业人士会回答这个问题,最好是那些实际使用过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负责OS外壳的集成。Java类库(API)是一组使用JVM的功能,这就是为什么它也称为API

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

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


因此,实际上,JVM只提供了通用的JNI功能,JCL通过调用C代码来实现所有依赖于系统的操作?这是否意味着,一个人可以实现一个JVM,并简单地从另一个JVM借用JCL(对于相同的平台)?第一个问题:是的。第二个问题:理论上,这应该是可行的,是的。至少,我不明白为什么它不起作用。好吧,我接受你的答案,然后对JNI领域做一些研究。
void objArrayKlass::copy_array(arrayOop s, int src_pos, arrayOop d,
                       int dst_pos, int length, TRAPS) { ... }