在java中,Object类的私有(private)静态方法registerNatives()
是做什么的?
最佳答案
其他答案在技术上是正确的,但对于没有 JNI 经验的人来说不是很有用。 :-)
通常,为了让 JVM 找到您的 native 函数,它们必须以某种方式命名。例如,对于 java.lang.Object.registerNatives
,对应的 C 函数名为 Java_java_lang_Object_registerNatives
。通过使用 registerNatives
(或者更确切地说,JNI 函数 RegisterNatives
),您可以随意命名您的 C 函数。
以下是相关的 C 代码(来自 OpenJDK 6):
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]));
}
(请注意,Object.getClass
不在列表中;它仍将由 Java_java_lang_Object_getClass
的“标准”名称调用。)对于列出的函数,相关的 C 函数如表中所列,这比编写一堆转发函数更方便。
如果您将 Java 嵌入到 C 程序中并希望链接到应用程序本身(而不是共享库中)的函数,或者所使用的函数没有以其他方式“导出”,则注册 native 函数也很有用,因为这些通常不会被标准方法查找机制找到。注册 native 函数也可用于将 native 方法“重新绑定(bind)”到另一个 C 函数(例如,如果您的程序支持动态加载和卸载模块,则很有用)。
我鼓励大家阅读 JNI book ,其中谈到了这一点以及更多。 :-)
关于java - registerNatives() 方法有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1010645/