Android NDK中的JNI清理和​​守护程序线程

时间:2012-03-10 06:32:40

标签: java android c android-ndk java-native-interface

这就是JNI的流程

JNI_onLoad - 获取 JavaVM (获取调用静态方法的jclass)

然后需要从Java调用一些东西到C:

GetEnv() JNIEnv AttachCurrentThread()来使用它。
调用java方法
进程java方法返回值 DetachCurrentThread() - 免费帖子
最后有些人 的 DestroyJavaVM()

好问题是:

  1. 如果我需要这样做,可以调用DestroyJavaVM()吗?在我的主要活动中的 onDestroy()中?
  2. JNI_onUnload 曾经打电话,我必须清理那里吗?
  3. 我是否需要以某种方式免费 jclass 我存储在静态全局变量中?
  4. JNI释放本地超出范围jarray / jarray元素,字符串和字符串字符,函数返回后的作业或我必须始终关注它(调用 env->发布(某事物))
  5. AttachCurrentThreadAsDaemon()的好处和用法是什么?

1 个答案:

答案 0 :(得分:1)

  1. 当您不再使用JVM时(可能在程序结束时),必须调用DestroyJavaVM()。

  2. 卸载类时调用JNI_onUnload(例如,因为删除了类加载器)。

  3. 释放一个Class null引用它并删除它的类加载器。

  4. JNI jarrays / jarrays元素,字符串和jobject由JVM分配或使用C缓冲区(您管理);前一种情况见#3。

  5. AttachCurrentThreadAsDaemon()告诉JVM它不应该在关机时等待线程退出(对守护进程有帮助)。

  6. 祝你好运!