From aeecd76b31e1c81ece7a9d7b3b9140d56806c582 Mon Sep 17 00:00:00 2001 From: Omooo <869759698@qq.com> Date: Thu, 23 May 2019 12:25:32 +0800 Subject: [PATCH] =?UTF-8?q?finsh=20=E6=B7=B1=E5=85=A5=E7=90=86=E8=A7=A3=20?= =?UTF-8?q?JNI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 + .../深入理解 JNI.md | 151 +++++++++++++++++- .../深入理解 Android 卷一/JNI.png | Bin 0 -> 39151 bytes 3 files changed, 149 insertions(+), 6 deletions(-) create mode 100644 images/Android/Framework/深入理解 Android 卷一/JNI.png diff --git a/README.md b/README.md index f0b2be4..35c8e2d 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,10 @@ Android Notes [Android 系统启动](https://github.com/Omooo/Android-Notes/blob/master/blogs/Android/Framework/Android%20%E7%B3%BB%E7%BB%9F%E5%90%AF%E5%8A%A8.md) +《深入理解 Android 卷一》 + +- [深入理解 JNI](https://github.com/Omooo/Android-Notes/blob/master/blogs/Android/Framework/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%20Android%20%E5%8D%B7%E4%B8%80/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%20JNI.md) + #### Java 基础 [final 你需要知道的一切](https://github.com/Omooo/Android-Notes/blob/master/blogs/Java/final.md) diff --git a/blogs/Android/Framework/深入理解 Android 卷一/深入理解 JNI.md b/blogs/Android/Framework/深入理解 Android 卷一/深入理解 JNI.md index 9787179..d117cc2 100644 --- a/blogs/Android/Framework/深入理解 Android 卷一/深入理解 JNI.md +++ b/blogs/Android/Framework/深入理解 Android 卷一/深入理解 JNI.md @@ -4,9 +4,18 @@ #### 目录 -1. 前言 -2. 实例分析之 MediaScanner -3. Java 层的 MediaScanner +1. 思维导图 +2. 前言 +3. 实例分析之 MediaScanner +4. Java 层的 MediaScanner +5. JNI 层 MediaScanner + - JNI 函数注册 + - 垃圾回收 + - JNI 中的异常处理 + +#### 思维导图 + +![](https://i.loli.net/2019/05/23/5ce61fe19639165339.png) #### 前言 @@ -52,7 +61,7 @@ public class MediaScanner implements AutoCloseable { 但是在 JNI 层,要完成的任务可没那么轻松了。 -#### JNI 层 MeidaScanner +#### JNI 层 MediaScanner 看下 android.media.MediaScanner.cpp 源码: @@ -76,6 +85,8 @@ android_media_MediaScanner_processFile( Java 层,native_init 函数位于 android.media 包中,它的全路径名应该是 android.media.MediaScanner.native_init,而 JNI 层函数的名字就是把 "." 替换成了 "_",通过这样,就可以把 Java 中的 Native 函数和 JNI 层的函数关联起来了。 +##### JNI 函数注册 + 其实上面说的就是 JNI 函数的注册问题。注册,即将 Java 层的 native 函数和 JNI 层对应的实现函数关联起来。JNI 函数的注册方法实际上有以下两种: 1. 静态注册 @@ -90,6 +101,134 @@ Java 层,native_init 函数位于 android.media 包中,它的全路径名应 2. 动态注册 - Java native 函数和 JNI 函数是一一对应的,在 JNI 中,用一个叫 JNINativeMethod 的结构来保存这种关联关系。 + Java native 函数和 JNI 函数是一一对应的,在 JNI 中,用一个叫 JNINativeMethod 的结构来保存这种关联关系。定义如下: + + ```c + typedef struct { + //Java 中 native 函数的名字,不用携带包的路径,例如 "native_init" + const char* name; + //Java 函数的签名信息,用字符串表示,是参数类型和返回值类型的组合 + //因为 Java 支持函数重载,所以通过 name 和 signature 可确定唯一 + const char* signature; + //JNI 层对应函数的函数指针,注意它是 void* 类型 + void* fnPtr; + }JNINativeMethod; + ``` + + 然后看下 MediaScanner JNI 层是如何做的? + + ```c + static const JNINativeMethod gMethods[] = { + + { + "processFile", + "(Ljava/lang/String;Ljava/lang/String;Landroid/media/MediaScannerClient;)Z", + (void *)android_media_MediaScanner_processFile + }, + //... + { + "native_init", + "()V", + (void *)android_media_MediaScanner_native_init + } + }; + //注册 JNINativeMethod 数组 + // This function only registers the native methods, and is called from + // JNI_OnLoad in android_media_MediaPlayer.cpp + int register_android_media_MediaScanner(JNIEnv *env) + { + return AndroidRuntime::registerNativeMethods(env, + kClassMediaScanner, gMethods, NELEM(gMethods)); + } + ``` + + AndroidRunTime 类提供了一个 registerNativeMethods 函数来完成注册工作,其实现为: + + ```c + //AndroidRunTime.cpp + /*static*/ int AndroidRuntime::registerNativeMethods(JNIEnv* env, + const char* className, const JNINativeMethod* gMethods, int numMethods) + { + return jniRegisterNativeMethods(env, className, gMethods, numMethods); + } + ``` + + 其中 jniRegisterNativeMethods 是 Android 平台中为了方便 JNI 使用而提供的一个帮助函数,代码为: + + ```c + //JNIHelp.c + MODULE_API int jniRegisterNativeMethods(C_JNIEnv* env, const char* className, + const JNINativeMethod* gMethods, int numMethods) + { + JNIEnv* e = reinterpret_cast(env); + + //因为 JNINativeMethod 使用的函数名并非路径名,所以要先指明是哪个类 + scoped_local_ref c(env, findClass(env, className)); + + //实际上调用 JNIEnv 的 RegisterNatives 函数完成注册 + int result = e->RegisterNatives(c.get(), gMethods, numMethods); + + return 0; + } + ``` + + 以上,在自己的 JNI 层代码中使用这种方法,就可以完成动态注册了。那么这些动态注册的函数在什么时候在上面地方被调用的呢? + + 当 Java 层通过 System.loadLibrary 加载完 JNI 动态库后,紧接着会查找该库中一个叫 JNI_OnLoad 的函数。如果有,就调用它,而动态注册的工作就是在这里完成的。 + + 所以,如果想使用动态注册方法,就必须实现 JNI_OnLoad 函数,只有在这个函数中才有机会完成动态注册的工作。 + + ```c + //android_media_MediaPlayer.cpp + jint JNI_OnLoad(JavaVM* vm, void* /* reserved */) + { + JNIEnv* env = NULL; + jint result = -1; + + if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) { + goto bail; + } + assert(env != NULL); + + //动态注册 MediaScanner 的 JNI 函数 + if (register_android_media_MediaScanner(env) < 0) { + goto bail; + } + + //... + + /* success -- return valid version number */ + result = JNI_VERSION_1_4; + + bail: + return result; + } + ``` + +##### 垃圾回收 + +Java 中创建的对象最后是由垃圾回收器来回收和释放内存的,如果 Java 层的对象被回收了,那么肯定会影响 JNI 层。JNI 技术一共提供了三种类型的引用,它们分别是: + +- Local Reference 本地引用 + + 在 JNI 层函数中使用的非全局引用对象都是 Local Reference,它包括函数调用时传入的 jobject 和在 JNI 层函数中创建的 jobject。Local Reference 最大的特点就是,一旦 JNI 层函数返回,这些 jobject 就可能被垃圾回收。 + +- Glabal Reference 全局引用 + + 这种对象如不主动释放,它永远不会被垃圾回收。 + +- Weak Global Reference 弱全局引用 + + 一种特殊的 Global Reference,在运行过程中可能会被垃圾回收。所以使用它之前,需要调用 JNIEnv 的 isSameObject 判断它是否被回收了。 + +所以每当 JNI 层想要保存 Java 层中的某个对象时,就可以使用 Global Reference,使用完后记住释放它就可以了。 + +##### JNI 中的异常处理 + +JNI 中也有异常,不过它和 C++、Java 的异常不太一样。如果调用 JNIEnv 的某些函数出错了,则会产生一个异常,但这个异常不会中断本地函数的执行,直到从 JNI 层返回到 Java 层后,虚拟机才会抛出这个异常。虽然在 JNI 层中产生的异常不会中断本地函数的运行,但一旦产生异常后,就只能做一些资源清理工作了(例如释放全局引用,或者 ReleaseStringChars)。如果这时调用除上面所说函数之外的其他 JNIEnv 函数,则会导致程序死掉。 + +JNI 层函数可以在代码中截获和修改这些异常,JNIEnv 提供了三个函数给予帮助: - \ No newline at end of file +1. ExceptionOccured 函数,用来判断是否发生异常 +2. ExceptionClear 函数,用来清理当前 JNI 层中发生的异常 +3. ThrowNew 函数,用来向 Java 层抛出异常 \ No newline at end of file diff --git a/images/Android/Framework/深入理解 Android 卷一/JNI.png b/images/Android/Framework/深入理解 Android 卷一/JNI.png new file mode 100644 index 0000000000000000000000000000000000000000..cbc9947e6f26913b2c2966cbe8d074c98327db26 GIT binary patch literal 39151 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