2

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

我尝试使用 ConditionVariable 来实现此解决方案,但是我收到一个 VM 错误,其中包含指示“致命的自旋挂起,转储线程”的注释。

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

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

4

1 回答 1

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);
}
于 2012-05-24T16:41:37.647 回答