其他答案在技术上是正确的,但对于没有JNI经验的人不是非常有用。 🙂
通常,为了让JVM找到你的本地函数,它们必须以某种方式命名。例如,对于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函数如该表中所列,这比编写一堆更方便的转发功能。
注册本地函数也很有用,如果你在你的C程序中嵌入Java,并希望链接到应用程序本身(而不是在共享库中)的函数,或者使用的函数不会被“导出”,因为这些通常不会被标准方法查找机制找到。注册本地函数也可以用于将本地方法“重新绑定”到另一个C函数(例如,如果程序支持动态加载和卸载模块,则非常有用)。
我鼓励大家阅读JNI book,谈论这个和更多。 🙂