java JNI 实现原理 (三) JNI中的RegisterNatives方法

本文详细介绍了如何使用javah生成JNI头文件并实现自定义JNI方法,以及通过直接RegisterNative方法手动注册native方法的过程。包括命名规则、方法结构与参数解释。

我们常用javah去生成JNI的头文件,然后去实现自己定义的JNI方法,使用这种方式比较传统,我们可以看到定义的格式甚至连名字都必须按照规范

JNIEXPORT jint JNICALL Java_test_symlink
  (JNIEnv *, jobject, jstring, jstring);

完整的结构是Java_classpath_classname_native method name,这样才能当jvm运行的时候根据这个命名规则去找到对应的native的方法。

实际上jvm也同时提供了直接RegisterNative方法手动的注册native方法

下面是一个代码的例子

static JNINativeMethod methods[] = {
    {"retrieveDirectives",  "()Ljava/lang/AssertionStatusDirectives;", (void *)&JVM_AssertionStatusDirectives}
};


    (*env)->RegisterNatives(env, cls, methods, 
			    sizeof(methods)/sizeof(JNINativeMethod));


RegisterNative 函数中的参数 

RegisterNative(JNIEnv, jclass cls, JNINativeMethod *methods,  jint number)

1. methods 是一个二维数组,代表着这个class里的每一个native方法所对应的实现的方法,在前面的例子中表示,一个native 方法retrieveDiretives, 返回值为AssertionStatusDirectives, 所对应的执行的本地方法是JVM_AssertionStatusDirectives

2. 后面的number 代表要指定的native的数量


RegisterNative的实现

RegisterNative 的实现非常简单,就是将class里面native的方法的地址+1指向执行的c代码的函数地址也就是上面的&JVM_AssertionStatusDirectives

  address* native_function_addr() const          { assert(is_native(), "must be native"); return (address*) (this+1); 







评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值