一.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回收。