注册

Android JNI 原理

  • JNI:Java Native Interface

image.png

1. 系统源码中的 JNI

image.png

2. MediaRecorder 框架中的 JNI

MediaRecorder,用于录音和录像。

image.png

2.1 Java Framework 层的 MediaRecorder

image.png

image.png

2.2 JNI 层的 MediaRecorder

image.png

2.3 Native 方法注册

Native 方法注册分为静态注册和动态注册,其中静态注册多用于 NDK 开发,而动态注册多用于 Framework 开发。

2.3.1 静态注册

image.png

image.png

静态注册就是 Java 的 Native 方法通过方法指针来与 JNI 进行关联,如果 Java 的 Native 方法知道它在 JNI 中对应的函数指针,就可以避免上述的缺点,这就是动态注册。

2.3.2 动态注册

image.png

image.png

image.png

3. 数据类型的转换

Java 的数据类型到了 JNI 层就需要转换为 JNI 层的数据类型。

3.1 基本数据类型的转换

image.png

3.2 引用数据类型的转换

image.png

image.png

image.png

4. 方法签名

JNI 的方法签名的格式为: (参数签名格式...)返回值签名格式

image.png

image.png

5. 解析 JNIEnv

  • JNIEnv
  • Java VM
  • JNINativeInterface
  • JNIInvokeInterface
  • AttachCurrentThread
  • DetachCurrentThread

image.png

image.png

5.1 jfieldID 和 jmethodID

image.png

image.png

image.png

5.2 使用 jfieldID 和 jmethodID

image.png

image.png

6. 引用类型

  • 本地引用(Local References)
  • 全局引用(Global References)
  • 弱全局引用(Weak Global References)

6.1 本地引用

image.png

image.png

  • FindClass
  • DeleteLocalRef

6.2 全局引用

全局引用和本地引用几乎是相反的,它主要有以下特点:

image.png

image.png

  • NewGlobalRef
  • DeleteGlobalRef

6.3 弱全局引用

image.png

image.png

  • NewWeakGlobalRef
  • DeleteWeakGlobalRef
  • IsSameObject

0 个评论

要回复文章请先登录注册