java - registerNatives() 方法有什么作用?

标签 java c object methods java-native-interface

在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/

相关文章:

c# - 初始化类的要点?

java - 未找到 sun.security.ssl.SSLSessionImpl

java - 在服务器端有一个后台线程定期更新请求使用的一些数据的最佳实践?

java - 向 Gradle 添加额外的测试套件

objective-c - 解析 Graphviz 的 Dot 语言

c++ - 类方法内部链接

java - Spring 中的 XSD 客户端

c - 从文件中读取 N 个字节,然后转换为整数的首选方法

JavaScript继承模式

matlab - 如何在 Matlab 中通过引用传递?