我的问题主要是关于标准,但也欢迎输入具体实现如何处理这个问题。因此,如果不做进一步的重做,我的问题是;
- 谁负责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) { ... }