当前位置: 首页 > 知识库问答 >
问题:

NDK应用程序on Destroy清理-如何拆卸货币线程

乐正心思
2023-03-14

所以如果我们连接,我们必须在完成后分离线,对吗?

JNIEnv* get_jni_env()
{
JNIEnv* res;
JAVA_VM->GetEnv((void**) &res, JNI_VERSION_1_6);//Using cached JavaVM
JAVA_VM->AttachCurrentThread(&res, NULL);
return res;
}

我调用下一个本机方法从@覆盖保护无效onDestroy()我的活动类

 void free_jni_manager()
 {
   JNIEnv* env = get_jni_env();
   ... //Here i delete global refs (jclass)
  //JAVA_VM->DetachCurrentThread();
 }

错误:使用interp帧分离线程(计数=16)-主线程仍在运行,我们尝试分离它。

即使我们使用任何使用JNIEnv的函数(例如调用java方法),放置DetachMoney tThread也会导致同样的错误。

如果在pthread函数中使用,DetachCurrentThread可以完美地工作

static void* thread_func(void* arg)
{
 get_jni_env(); // attach new thread
 //Do thread stuff
 JAVA_VM->DetachCurrentThread();//thread done detached it with ok
 return NULL;
}

我们需要分离主线程吗?然后我们用JNI完成了,可以吗?否则活动将被破坏,它将用JavaVM释放自己?我们是否需要调用DestroyJavaVM()(如果使用onDestroy,只需执行崩溃),免费缓存的JavaVM或垃圾清理器将如何处理这个问题?

P、 使用AttachCurrentThreadAsDaemon()有什么好处

共有2个答案

顾承平
2023-03-14

不要从主线程调用JNI处理函数。从主线程调用JNI处理函数将导致崩溃。

齐琦
2023-03-14

活动。onDestroy()方法在UI线程上调用。为什么要尝试将Java虚拟机与UI线程分离?该线程由系统管理,您不应该将Java虚拟机与之连接或分离。

JNIEnv*可用于每个本机方法作为第一个参数。为什么首先需要get_jni_env()

如果您需要工作线程上的JNIEnv,那么您需要附加和分离(或者从Java生成一个线程;这很容易)。

编辑:如果是重复附件,则不需要拆离。这不是一个参考计数系统<代码>AttachCurrentThread记录为

尝试附加已经附加的线程是没有操作的。

而不是需要匹配的附加/分离调用。

 类似资料:
  • 我在Laravel4和MySQL中使用PHP,我不知道如何处理货币值。 我想使用以下格式显示它们: 金额字段的类型为。 我应该像或像那样保存金额吗?

  • 我试过... 但那就不允许便士条目了。 我想要增量按钮控制在英镑上升,但仍然想要输入便士的能力。 谢谢,1DMF

  • 我可以使用ISO 4217代码轻松设置货币,例如“USD”。这将使我能够使用抓取美元符号。getSymbol(),但是,我该如何从货币中提取显示名“dollar”? 我有一个微调器,我想用“美元”、“欧元”、“日元”等货币的名称填充。但是,我无法从ISO 4217代码中提取这些名称。这不是很容易吗? 请注意,我不能使用简单的字符串数组来解决这个问题。这是因为我获取了默认的语言环境,并将其货币添加到

  • 这听起来可能很基本,但在中,我应该清理什么?如果片段正在被销毁,是否应该为我自动清理引用(如上下文)?

  • 我有一个简单的控制台应用程序,有时需要执行图形操作,对于那些我使用JavaFx框架(有一些功能,我需要像css样式的文本)我只是生成一些形状和文本到一个隐藏的场景,然后保存在文件中仅此而已, 我知道要使用JavaFx,我必须将图形操作传递给JavaFx线程,但是当一切都完成后,我必须关闭应用程序(几个小时后),这个JavaFx线程仍然保持打开...我真的不想强行退出System.exit(),因为