深入理解JNI


1. 主程序JAVA 调用C函数

    1.1  注册JNI

           (1) 静态注册;

           (2) 动态注册;动态注册的函数的时机: System.loadLibray 加载JNI动态库,查找 JNI_OnLoad函数,如有,就调用它。动态注册就在这里。

    1.2 JNIEnv

          疑问:

    

#if defined(__cplusplus)
typedef _JNIEnv JNIEnv;
typedef _JavaVM JavaVM;
#else
typedef const struct JNINativeInterface* JNIEnv;
typedef const struct JNIInvokeInterface* JavaVM;
#endif

        为什么C 和C++ JNIEnv结果的设计要不同?? 第一个参数不一样,即C++,通过this即可至指定。

        重要:JNIEnv 是一个线程相关的变量。但 JavaVM 独有一份,它是JAVA虚拟机在JNI曾的代表。

    1.3. Java 数据类型和JNI数据类型转换

              (1) 基本类型转化关系”       “Primitive types that match up with Java equivalents“

             (2)  JNI引用类型和java引用类型的转化关系

    1.4  JNI 操作JAVA对象

         (1) 访问java对象

        (2) 操作成员变量(域) 和方法


         (3)  关键区别 局部引用和 全局引用:局部引用是JNI默认的,它仅在JNI本地函数内有效,当JNI本地函数返回后,其内部的引用就会失效。

         可以用nev->NewGlobalRef 得到全局引用。

2. 主程序C/C++,调用JAVA类: JNI 提供了Invocation API

     关键函数JNI_CreateJavaVM

     以Invocation API 在Android中的应用举例,zygote进程

       以system_server: 为例,在函数onload.cpp 已经实现了 JNI_OnLoad() 函数。



3. Android NDK 开发,后面再学


3. JNI 异常处理

你可能感兴趣的:(深入理解JNI)