java - Android NDK 中的 JNI 清理和守护线程

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

这就是 JNI 的流程

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

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

GetEnv() 获取 JNIEnvAttachCurrentThread() 使用它。
调用java方法
处理java方法返回值。
DetachCurrentThread() - 空闲线程
到最后
销毁JavaVM()

问题是:

  1. 在那里可以调用 DestroyJavaVM() ,如果我需要这样做?在我的主要 Activity 的 onDestroy() 中?
  2. JNI_onUnload 是否曾经调用过以及我必须在那里清理什么?
  3. 我是否需要存储在静态全局变量中的免费jclass
  4. 函数返回后,JNI 是否释放本地超出范围的 jarrays/jarrays 元素、字符串和字符串字符、jobjects,或者我必须始终关注这一点(调用 env->Release(something))
  5. AttachCurrentThreadAsDaemon() 的优点和用法是什么?

最佳答案

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

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

  3. 释放类,使其引用无效并删除其类加载器。

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

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

祝你好运!

关于java - Android NDK 中的 JNI 清理和守护线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9644450/

相关文章:

java - 在没有 Maven 的情况下使用 Jclouds

java - 是否可以使用@Transactional 测量所有 Spring 管理的事务的时间?

android - 为什么 Eclipse 不理解 Build.VERSION_CODES.KITKAT?

java - Android 中的 for 循环在项目之间创建间隙

c - 如何将一个元素移动到固定数组的左侧

java - Spring 向 JSP 传递值

Java Math.pow((1/(1+1),1) 无法正确计算

android - 如何在 TableLayout 中垂直拉伸(stretch)一行?

c - 如何调试 Matlab 引擎 C API?

c - "loop_until_bit_is_set"宏和 while() 表达式之间的区别