代码之家  ›  专栏  ›  技术社区  ›  Hubris

registerNatives()方法的作用是什么?

  •  78
  • Hubris  · 技术社区  · 17 年前

    registerNatives()

    3 回复  |  直到 14 年前
        1
  •  100
  •   C. K. Young    13 年前

    其他答案在技术上是正确的,但对于没有JNI经验的人来说不是很有用。 :-)

    java.lang.Object.registerNatives Java_java_lang_Object_registerNatives .通过使用 registerNatives RegisterNatives

    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

    如果您将Java嵌入到C程序中,并希望链接到应用程序本身(而不是共享库中)中的函数,或者使用的函数没有以其他方式“导出”,因为这些函数通常不会被标准方法查找机制找到,那么注册本机函数也很有用。注册本机函数也可用于将本机方法“重新绑定”到另一个C函数(例如,如果您的程序支持动态加载和卸载模块,则很有用)。

    我鼓励大家阅读 JNI book

        2
  •  8
  •   frogatto    10 年前

    java.lang.Object.registerNatives 在之前的回答中,这只是一个 RegisterNatives

    1. registerNatives

      b.在本机代码中,定义一个名为 Java_<your fully qualified class name>_registerNatives .

      方法在调用其他本机方法之前被调用。

    1. JNI_OnLoad

      jint JNI_OnLoad(JavaVM *vm, void *reserved) .在此函数体中,调用JNI函数 .

      b.Java虚拟机将自动查找并调用 JNI_OnLoad System.loadLibrary env 通过调用指针 GetEnv 表中的函数 vm