当Object.h / .cpp编译时

时间:2018-01-08 18:08:01

标签: java jvm java-native-interface

我的问题是:Object.h/Object.cpp(java类"Object")何时编译? 它是与JVM一起编译的(编译JVM时)还是动态地包含在JVM中(.dll)?

  • 我的问题涉及JVM的实施
  • 我们假设它是用C / C ++实现的

JNI的理念是创建本机方法,JVM与这些类之间的通信是通过DLL文件完成的。但对于本机方法,如Object的本机方法,我无法理解这些方法是否以相同的方式(通过DLL文件)或不同的方式进行通信。

1 个答案:

答案 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的其他本机方法:hashCodewaitnotify等。相应的C ++函数{{1 },JVM_IHashCodeJVM_MonitorWait是JVM的一部分。它们是在HotSpot构建时从jvm.cpp编译到JVM_MonitorNotify

但是,使用常规JNI接口在JDK side上仍然实现了另一种方法jvm.dll

Object.getClass