一.JNI概述。
JNI:是java与其他语言通信的桥梁。
需要用到JNI技术的地方:
1.需要调用java语言不支持的依赖于操作系统平台特性的一些功能。
2.为了整合一些以前的非java语言开发的系统。
3.为了节省程序的运行时间。必须采用其他语言(比如:c/c++)来提升运行效率。
JNI在android中的运用场景:音视频开发、热修复和插件化、逆向开发、系统源码调用等。
二.Native方法注册
Native方法注册分为静态注册和动态注册。
1.静态注册
原理:Java的Native方法通过指针来与JNI进行关联。
过程:将需要关联的java文件编译和生成JNI方法。执行如下命令:
javac com/example/MediaRecorder.java
javah com.example.MediaRecorder
缺点:
①.JNI层的函数名称太长。
②.声明Native方法的类需要用到javah生成的头文件。
③.初次调用Native方法时需要建立关联,影响效率。
2.动态注册
MedioRecorder动态注册过程源码解析:
①.在android_media_MediaRecorder.cpp中的gMethods数组中存储着Native方法与JNI层函数对应关系。
②.在android_media_MediaPlayer.cpp中调用register_android_media_recorder(env)方法。
③.最终调用JNIHelp.cpp中的JNIEnv的RegisterNatives函数来完成JNI的动态注册。
三.数据类型转换(基础数据类型,引用数据类型)详细见240页。
四.方法签名:由签名格式组成。
签名格式:(参数签名格式...)返回值签名格式
五.解析JNIEnv
主要作用:1.调用java方法;2.操作java(操作java中的变量及对象等)
常用操作:
1.FindClass找到Java中指定名称的类。
2.GetMethodID用来得到Java中的方法。
3.GetFieldID用来得到Java中的成员变量。
六.引用类型
1.本地引用:JNIEnv所返回的引用类型基本都是本地引用。
特点:
当Native函数返回时,本地引用会被自动释放。
只有创建他的线程有效,不能跨线程使用。
局部引用是JVM负责的引用类型,受JVM管理。
2.全局引用:
在native函数返回时不会被自动释放,因此全局引用需要手动来进行释放,并且不会被GC回收。
全局引用可以跨线程使用。
全局引用不受JVm管理。
3.弱全局引用:和全局引用类似不同点是弱全局引用可以被GC回收。