2

私のAndroidアプリケーションでは、ネイティブスレッドからJavaコードへのコールバックがあり、メインUIスレッドと同期する必要があります。UIスレッドは、ネイティブスレッドから返された情報に基づいてオプションのリストを表示することを目的としています。ユーザーがオプションを選択するまで、ネイティブスレッドはブロックする必要があります。ユーザーがオプションを選択すると、ネイティブスレッドが値を読み取り、実行を継続します。

ConditionVariableを使用してこのソリューションを実装しようとしましたが、「致命的なスピンオンサスペンド、スレッドのダンプ」というコメントを含むVMエラーが発生します。

Javaベースの同期オブジェクトを使用してこれらのスレッドを同期することはできないように見えます。2つの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 に答える