我的问题是:Object.h/Object.cpp
(java类"Object"
)何时编译?
它是与JVM一起编译的(编译JVM时)还是动态地包含在JVM中(.dll)?
JNI的理念是创建本机方法,JVM与这些类之间的通信是通过DLL文件完成的。但对于本机方法,如Object的本机方法,我无法理解这些方法是否以相同的方式(通过DLL文件)或不同的方式进行通信。
答案 0 :(得分:2)
没有指定JVM如何链接Object的本机方法;不同的JVM实现可能会有不同的做法。至于OpenJDK和HotSpot JVM,java.lang.Object
的原生方法背后没有任何魔力。它们的绑定方式与用户定义的本机绑定方式相同。
注意:不要求从一个共享库加载Java类的本机代码 - 它可以分散在多个库中。这正是Object的本机方法发生的事情:其中一些内置于JVM中,另一些则在java.dll
中实现。
初始化java.lang.Object
类时,会调用其registerNatives
方法。此方法的本机实现是JDK类库的一部分。它在JDK构建时从Object.c
编译到java.dll
。
static JNINativeMethod methods[] = {
{"hashCode", "()I", (void *)&JVM_IHashCode},
{"wait", "(J)V", (void *)&JVM_MonitorWait},
{"notify", "()V", (void *)&JVM_MonitorNotify},
{"notifyAll", "()V", (void *)&JVM_MonitorNotifyAll},
{"clone", "()Ljava/lang/Object;", (void *)&JVM_Clone},
};
JNIEXPORT void JNICALL
Java_java_lang_Object_registerNatives(JNIEnv *env, jclass cls)
{
(*env)->RegisterNatives(env, cls,
methods, sizeof(methods)/sizeof(methods[0]));
}
此方法调用JNI RegisterNatives绑定java.lang.Object
的其他本机方法:hashCode
,wait
,notify
等。相应的C ++函数{{1 },JVM_IHashCode
和JVM_MonitorWait
是JVM的一部分。它们是在HotSpot构建时从jvm.cpp
编译到JVM_MonitorNotify
。
但是,使用常规JNI接口在JDK side上仍然实现了另一种方法jvm.dll
:
Object.getClass