深入理解JNI(《深入理解android》(author : 邓凡平)读书札记)
JNI的技术特点:
java能够调用native代码。
native代码能够调用java代码。
JNI的技术考虑:
实现java代码的平台无关型。
java语言发展初期使用C和C++代码,避免重复轮子的需要。
举例子说明:
MediaScanner.java文件
其中native_init()是native方法,是需要C和C++去实现的,
system.loadLibrary("medua_jni");为加载编译后的so文件。
那么对应java层要实现的代码就是:
然后看看JNI层的实现:
JNI层需要讲 java层的“.”转换为“_”
JNI的注册:
1静态注册:
MediaScanner.java文件按照这种方式生成的JNI代码就是如下代码:
静态注册是根据函数名建立java函数和JNI函数之间的关联关系的。
缺点:
1 需要通过javah来编译类里面含有native函数的class文件生成对应的jni代码
2 javah生成的名字过长了。
3 第一次调用native函数要根据函数名字来所有对应JNI层来建立关联关系。
动态注册:
JNINativeMedia的结构:
数据类型转换:
基本数据类型转换:
引用数据类型转换:
Java代码中中代码:
对应JNI代码:
java中的对象:MediaScannerClient对应JNI代码中的Jobject
仔细看代码出现多余的参数:
JNIEnv
JNIEnv内部结构图:
JNIEnv提供了一些JNI系统函数:
调用java函数;操作jobject对象等很多事情。
JNIEnv具有线程相关型:
每条线程对应的JNIEnv不能在其他线程中使用。
JNIEnv与JVM之间的关系:
通过JNIEnv操作jobject
JNIEnv的成员变量和成员函数
成员变量:jfieldID
成员函数:jmethodID
如何获取JNIEnv的成员变量和成员函数呢:
举例子:
如何通过jfield操作jobject?
jstring
看下例子:
类型标识表:
其实java也提供对应的生成工具方便开发:
垃圾回收:
JNI中的引用:
对local reference的释放:
对Global reference的释放:
JNI异常处理: