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. JavaSystem.loadLibrary()的执行过程   参考链接 http://my.oschina.net/wolfcs/blog/129696
未完,待续。
0 0
原创粉丝点击