JNI函数的动态注册
来源:互联网 发布:淘宝企业店铺的费用 编辑:程序博客网 时间:2024/06/05 15:43
动态注册jni函数的过程,和一些意外的发现1. 动态注册jni函数的过程 在调用 System.loadLibrary()方法时JVM会加载其参数指定的共享库。然后,JVM共享库内的函数符号, 检查JNI_OnLoad()函数是否被实现,若共享库中有JNI_OnLoad()函数符号,则JNI_OnLoad()被自动调用 否则,JVM自动将本地方法与共享库内的JNI本地函数符号进行匹配. 在JNI_OnLoad()函数中调用RegisterNatives()函数实现JNI函数的动态注册. 首先向包含本地函数的库加入JNI_OnLoad()函数, 在该函数中调用RegisterNatives()函数, 共过JNINativeMethod结构将 java类的本地方法和JNI的本地函数映射在一起,大大的提高了Java native方法和JNI 本地函数直接的匹配效率. /* * function:确定JVM支持的JNI的版本 必须返回有关JNI版本的信息. * @param JavaVM *vm JVM接口指针 * @param void *reserved 预留参数 */ jint JNI_OnLoad(JavaVM *vm, void *reserved); /* * function: 判断JVM是否支持version指定的版本,然后将JNI接口指针设置到*env中 * @param JavaVM *vm JVM接口指针的地址 * @param void **env JNI接口指针地址 * @param jint version JNI版本 * Return 成功:返回0 失败:返回负数 */ jint GetEnv(JavaVm *vm, void **env, jint version); /* * 保存java类的native方法和JNI本地函数映射的信息 */ typedef struct { char *name; //本地方法名称 char *signature; //本地方法签名 void *fnPtr; //本地函数指针 }JNINativeMethod; /* * function: 将指定类中的native方法与JNI本地函数链接在一起 链接信息保存在JNINativeMethod结构体数组中. * @param JNIEnv *env JNI接口指针 * @param jclass clazz java类(为权限定名) * @param const JNINativeMethod *methods 链接信息 * @param jint nMethods methods数组中的元素个数 * Return 返回数组引用 否则 返回NULL */ jarray RegisterNatives(JNIEnv *env, jclass clazz, const JNINativeMethod *methods, jint nMethods); /* * funciton: 将指定的类的本地方法映射到JNI本地函数 调用RegisterNatives()函数 */ int jniRegisterNativeMethods(JNIEnv *env, const char *className, const JNINativeMethod *methods, jint nMethods);2. android源码中jni注册实例分析 a. 在JNI_OnLoad()函数中注册jni本地函数 b. 在C程序中注册jni本地函数 1. System Server:在JNI_OnLoad()函数中注册jni函数 (源码分析分析) framework/base/services/java/com/android/server/SystemServer.java private static native void nativeinit(); public static void main(String[] args){ ... System.loadLibrary("android_servers"); } framework/base/services/core/jni/onload.cpp extern "C" jint JNI_OnLoad(JavaVM *vm, void *reserved) { JNIEnv *env = NULL; ... register_android_server_SystemServer(env); ... return JNI_VERSION_1_4; } 2. app_process: 在C程序中注册jni本地函数3. Java中System.loadLibrary()的执行过程 参考链接 http://my.oschina.net/wolfcs/blog/129696
未完,待续。
0 0
- JNI函数的动态注册
- 动态注册jni函数
- android 动态注册Jni函数
- Android 动态注册JNI函数
- Android 动态注册JNI函数
- Android JNI的动态注册
- [Android]JNI动态注册Java函数教程
- Android开发值JNI函数动态注册
- JNI函数的注册方法
- [JNI学习]---JNI动态注册
- Android JNI 使用的数据结构JNINativeMethod详解 动态注册JNI
- 动态注册JNI
- 动态注册JNI
- jni动态注册
- 动态注册JNI
- JNI动态注册
- 动态注册JNI
- 动态注册JNI
- Android中AsyncTask的简单入手方式
- iOS 网络数据接收处理和存储方式
- PHP中empty()和isset()的区别
- android中Rect类的使用
- Opencv学习笔记(一)滤波器原理及其使用
- JNI函数的动态注册
- swustoj---寝室扫地问题509
- 过去一年 硅谷科技圈发生了这五大变化
- 《Spring实战》学习笔记-第一章:Spring之旅
- oracel字符截取substr
- 初识 Spatial Pyramid Matching
- DNS中的正向解析与反向解析 及 nslookup命令使用
- Sublime 运行Java
- 将imageview变灰,只需几行代码