在我的 android 应用程序中,我有一个从本机线程到 Java 代码的回调,需要与主 UI 线程同步。目的是 UI 线程根据从本机线程返回的信息显示选项列表。在用户选择一个选项之前,本机线程需要阻塞。用户选择一个选项后,本机线程读取该值并继续运行。
我尝试使用 ConditionVariable 实现此解决方案,但是出现 VM 错误,并带有注释“致命旋转挂起,转储线程”。
看起来好像不可能使用基于 Java 的同步对象来同步这些线程。在我有两个 Java 线程的情况下,该代码可以完美运行。
一般来说,有没有什么方法可以使用基于 Java 的同步对象来同步 Java 和本机线程,或者是否需要使用 NDK 来实现,并从 Java 线程调用实现同步的 NDK 函数?
执行此操作的方法不是使用基于 Java 的同步对象,而是使用基于 NDK 的同步对象,如下所示:
static pthread_cond_t uiConditionVariable = PTHREAD_COND_INITIALIZER;
static pthread_mutex_t uiConditionMutex = PTHREAD_MUTEX_INITIALIZER;
/**
* This function opens the condition variable which releases waiting threads.
*/
JNIEXPORT void JNICALL
Java_com_Xxxx_openConditionVariable(JNIEnv *env,jobject o)
{
pthread_mutex_lock(&uiConditionMutex);
pthread_cond_signal(&uiConditionVariable);
pthread_mutex_unlock(&uiConditionMutex);
}
/**
* This function blocks on the condition variable associated with the
*/
JNIEXPORT void JNICALL
Java_com_Xxxx_blockConditionVariable(JNIEnv *env,jobject o)
{
pthread_mutex_lock(&uiConditionMutex);
pthread_cond_wait(&uiConditionVariable,&uiConditionMutex);
pthread_mutex_unlock(&uiConditionMutex);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)