这就是 JNI 的流程
JNI_onLoad - 获取JavaVM(获取用于调用静态方法的jclass)
然后需要从Java调用一些东西到C:
GetEnv() 获取 JNIEnv 和 AttachCurrentThread() 使用它。
调用java方法
处理java方法返回值。
DetachCurrentThread() - 空闲线程
到最后
销毁JavaVM()
问题是:
- 在那里可以调用 DestroyJavaVM() ,如果我需要这样做?在我的主要 Activity 的 onDestroy() 中?
- JNI_onUnload 是否曾经调用过以及我必须在那里清理什么?
- 我是否需要存储在静态全局变量中的免费jclass?
- 函数返回后,JNI 是否释放本地超出范围的 jarrays/jarrays 元素、字符串和字符串字符、jobjects,或者我必须始终关注这一点(调用 env->Release(something))里>
- AttachCurrentThreadAsDaemon() 的优点和用法是什么?
最佳答案
当您不再使用 JVM 时(可能在程序末尾),必须调用 DestroyJavaVM()。
JNI_onUnload 在类卸载时调用(例如,因为它的类加载器被删除)。
释放类,使其引用无效并删除其类加载器。
JNI jarrays/jarrays 元素、字符串和 jobject 要么由 JVM 分配,要么使用 C 缓冲区(由您管理);前一种情况请参见#3。
AttachCurrentThreadAsDaemon() 告诉 JVM 它不应等待线程在关闭时退出(对守护进程有帮助)。
祝你好运!
关于java - Android NDK 中的 JNI 清理和守护线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9644450/