Android:本机线程与主线程的同步

时间:2012-05-21 21:35:32

标签: android android-ndk

在我的android应用程序中,我有一个从本机线程到Java代码的回调,需要与主UI线程同步。目的是UI线程基于从本机线程返回的信息显示选项列表。在用户选择本机线程需要阻止的选项之前。用户选择一个选项后,本机线程会读取该值并继续运行。

我尝试使用ConditionVariable实现此解决方案,但是我得到了一个VM错误,注释显示“Fatal spin-on-suspend,dumping threads”。

看起来好像不可能使用基于Java的同步对象来同步这些线程。在我有两个Java线程的情况下,代码完美无缺。

一般情况下,有没有办法使用基于Java的同步对象来同步Java和本机线程,或者是否需要使用NDK实现这一点,并且从Java线程调用实现同步的NDK函数?

1 个答案:

答案 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);
}