2012-05-21 2 views
2

내 안드로이드 응용 프로그램에서 기본 UI 스레드와 동기화되어야하는 Java 코드로 기본 스레드에서 콜백을 얻었습니다. 의도는 UI 스레드가 네이티브 스레드에서 반환 된 정보를 기반으로 옵션 목록을 표시한다는 것입니다. 사용자가 네이티브 스레드가 차단해야하는 옵션을 선택할 때까지 사용자가 옵션을 선택하면 원시 스레드가 값을 읽고 실행을 계속합니다.안드로이드 : 기본 스레드와 기본 스레드 동기화

나는 ConditionVariable을 사용하여이 솔루션을 구현하려고 시도했으나 "치명적인 스핀 - 온 - 일시 중지 스레드 덤핑"을 나타내는 VM 오류가 발생합니다.

Java 기반 동기화 객체를 사용하여 이러한 스레드를 동기화 할 수없는 것처럼 보입니다. 이 코드는 두 개의 Java 스레드가있는 경우 완벽하게 작동합니다.

일반적으로 Java 기반 동기화 객체를 사용하여 Java 및 원시 스레드를 동기화 할 수있는 방법이 있거나 Java 스레드에서 호출을 통해 NDK를 사용하여 동기화를 구현하는 NDK 기능으로 구현해야합니다 ? 이 작업을 수행하는 방법

답변

2

는 자바 기반의 동기화 객체를 사용하는 것이 아니라 오히려 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); 
}