Android JNI 原理
- JNI:Java Native Interface
1. 系统源码中的 JNI
2. MediaRecorder 框架中的 JNI
MediaRecorder,用于录音和录像。
2.1 Java Framework 层的 MediaRecorder
2.2 JNI 层的 MediaRecorder
2.3 Native 方法注册
Native 方法注册分为静态注册和动态注册,其中静态注册多用于 NDK 开发,而动态注册多用于 Framework 开发。
2.3.1 静态注册
静态注册就是 Java 的 Native 方法通过方法指针来与 JNI 进行关联,如果 Java 的 Native 方法知道它在 JNI 中对应的函数指针,就可以避免上述的缺点,这就是动态注册。
2.3.2 动态注册
3. 数据类型的转换
Java 的数据类型到了 JNI 层就需要转换为 JNI 层的数据类型。
3.1 基本数据类型的转换
3.2 引用数据类型的转换
4. 方法签名
JNI 的方法签名的格式为: (参数签名格式...)返回值签名格式
5. 解析 JNIEnv
- JNIEnv
- Java VM
- JNINativeInterface
- JNIInvokeInterface
- AttachCurrentThread
- DetachCurrentThread
5.1 jfieldID 和 jmethodID
5.2 使用 jfieldID 和 jmethodID
6. 引用类型
- 本地引用(Local References)
- 全局引用(Global References)
- 弱全局引用(Weak Global References)
6.1 本地引用
- FindClass
- DeleteLocalRef
6.2 全局引用
全局引用和本地引用几乎是相反的,它主要有以下特点:
- NewGlobalRef
- DeleteGlobalRef
6.3 弱全局引用
- NewWeakGlobalRef
- DeleteWeakGlobalRef
- IsSameObject