我的问题主要是关于标准,但是关于具体实现如何处理该问题的输入也是受欢迎的。所以没有进一步的重做,我的问题是;
这通常如何通过Java Native Interface实现?
实施例;我正在使用java.io.FileReader读取文件。当在这个对象上调用read
时,JVM显然会在JCL中的正确类文件中调用此函数,但是这段代码最终会依赖于JVM进行调用,例如posix {{1}功能? - 或者类文件是否会通过使用JNI自行完成? (假设必须完成read
,即文件不在缓存/内存中)
答案 0 :(得分: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。这就是各个部分的结合方式。
答案 1 :(得分:0)
为了回答您的核心问题,JVM负责OS shell集成。 Java类库(API)是一组使用JVM的功能,这就是它也被称为API的原因。
关于JNI集成,JVM正在处理这些调用。在类级别,您必须声明具有本机实现的代码。
我们以System.arraycopy()方法为例。此方法具有本机实现。 System类定义方法的签名,JVM负责将调用从System.arraycopy()方法转换为本机底层实现。如果从here下载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) { ... }