java JNI 实现原理 (三) JNI中的RegisterNatives方法
来源:互联网 发布:剑灵男捏脸数据导入图 编辑:程序博客网 时间:2024/05/21 09:53
我们常用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);
- java JNI 实现原理 (三) JNI中的RegisterNatives方法
- 实现JNI的另一种方法:使用RegisterNatives方法传递和使用Java自定义类 (转)
- JNI:使用RegisterNatives方法传递和使用Java自定义类
- JNI:使用RegisterNatives方法传递和使用Java自定义类
- JNI:使用RegisterNatives方法传递和使用Java自定义类
- JNI:使用RegisterNatives方法传递和使用Java自定义类
- JNI:使用RegisterNatives方法传递和使用Java自定义类
- JNI:使用RegisterNatives方法传递和使用Java自定义类
- android-jni RegisterNatives注册本地方法
- java JNI 实现原理 (四) 初始化JNI方法
- java JNI 实现原理 (五) JNI方法解释调用
- java JNI 实现原理 (六) 调用JNI方法
- Java JNI实现原理初探
- java JNI 实现原理 (一)
- Java JNI实现原理初探
- android开发--- jni使用RegisterNatives注册本地方法
- JNI方法的静态注册和动态注册RegisterNatives
- JNI中的C回调java中的方法
- Linux命令md5sum
- 面试技巧 - 怎样让candidate更多的谈论他们失败的项目。
- ZOJ2112 Dynamic Rankings 线段树+平衡树
- Sum Root to Leaf Numbers 求所有二叉树根到叶子节点路径之和 @LeetCode
- Longest Common Prefix 字符串数组中查找最长相同前缀字符串@LeetCode
- java JNI 实现原理 (三) JNI中的RegisterNatives方法
- 博弈论
- 每天在进步--如何使用div+css
- 阿里巴巴参谋长曾鸣全面深入阐释:何谓互联网的本质?
- 自己无聊做的一个简单的企业进销存管理系统
- 人肉搜索网上泄题者
- Java Socket编程
- jQuery .width(value)
- 技术真的就不是那么重要了