2012-05-21 109 views
2

同步在我的Android應用程序,我已經得到了從本地線程到Java代碼需要與主UI線程同步回調。目的是UI線程根據從本地線程返回的信息顯示選項列表。直到用戶選擇本地線程需要阻止的選項。在用戶選擇一個選項後,本地線程讀取值並繼續運行。安卓:本地線程與主線程

我試着用ConditionVariable實現此解決方案,但是我得到一個VM錯誤與評論表示「致命旋塗暫停,傾銷線程」。

看起來好像它不是可以使用一個基於Java的同步對象,以這些線程同步。在我有兩個Java線程的情況下,代碼完美工作。

一般來說,有沒有什麼方法可以使用基於Java的同步對象來同步Java和本地線程,還是需要使用NDK將Java線程調用到實現同步的NDK函數中來實現?

回答

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