一、谈谈你对 JNI 和 NDK 的理解
JNI:
1 | JNI 是 `Java Native Interface` 的缩写,即 Java 的本地接口。 |
NDK:
1 | NDK 是 `Native Development Kit` 的缩写,是 Android 的工具开发包。 |
总结:
JNI 是实现的目的,NDK 是 Android 中实现 JNI 的手段。
二、谈谈你对 JNIEnv 和 JavaVM 理解
JavaVM
1 | JavaVM 是虚拟机在 JNI 层的代表。 |
JNIEnv
1 | JNIEnv 表示Java调用native语言的环境,封装了几乎全部 JNI 方法的指针。 |
注意:
1 | 在 native 环境下创建的线程,要想和 java 通信,即需要获取一个 JNIEnv 对象。我们通过 `AttachCurrentThread` 和 |
三、解释一下 JNI 中全局引用和局部引用的区别和使用
全局引用
1 | 通过 `NewGlobalRef` 和 `DeleteGlobalRef` 方法创建和释放一个全局引用。 |
局部引用
1 | 通过 `NewLocalRef` 和 `DeleteLocalRef` 方法创建和释放一个局部引用。 |
扩展:弱全局引用
1 | 通过 `NewWeakGlobalRef` 和 `DeleteWeakGlobalRef` 创建和释放一个弱全局引用。 |
四、JNI 线程间数据怎么互相访问
1 | 考察点和上体类似,线程本来就是共享内存区域的,因此我们需要使用 `全局引用`。 |
五、怎么定位 NDK 中的问题和错误
1 | 一般在开发阶段的话,我们可以通过 log 来定位和分析问题。 |
六、静态注册和动态注册
静态注册:
1 | 通过 `JNIEXPORT` 和 `JNICALL` 两个宏定义声明,`Java + 包名 + 类名 + 方法名` 形式的函数名。不好的地方就是方法名太长了。 |
动态注册:
1 | 通常在 `JNI_OnLoad` 方法中通过 `RegisterNatives` 方法注册,可以不再遵从固定的命名写法(当然为了代码容易理解,名称还是 |
七、API
有的变态题目还是会考验你一些 API 的运用,比如怎么在 JNI 里面调用 Java 的方法,怎么在 JNI 里面抛异常等等。所以一些 API 还是要熟悉一下的,大致都是什么功能,名字大致是啥呀,这个太多了,看链接介绍吧: