在我的android应用程序中,我有一个从本机线程到Java代码的回调,需要与主UI线程同步。目的是UI线程基于从本机线程返回的信息显示选项列表。在用户选择本机线程需要阻止的选项之前。用户选择一个选项后,本机线程会读取该值并继续运行。
我尝试使用ConditionVariable实现此解决方案,但是我得到了一个VM错误,注释显示“Fatal spin-on-suspend,dumping threads”。
看起来好像不可能使用基于Java的同步对象来同步这些线程。在我有两个Java线程的情况下,代码完美无缺。
一般情况下,有没有办法使用基于Java的同步对象来同步Java和本机线程,或者是否需要使用NDK实现这一点,并且从Java线程调用实现同步的NDK函数?
答案 0 :(得分:2)
执行此操作的方法不是使用基于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);
}