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

其他答案在技术上是正确的,但对于没有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,谈论这个和更多。 🙂

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值