Android: native 线程与主线程同步

标签 android android-ndk

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

我尝试使用 ConditionVariable 来实现此解决方案,但出现 VM 错误,并带有注释“致命旋转挂起,转储线程”。

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

一般来说,有什么方法可以使用基于 Java 的同步对象来同步 Java 和 native 线程,或者是否需要使用 NDK 通过从 Java 线程调用实现同步的 NDK 函数来实现?

最佳答案

执行此操作的方法不是使用基于 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);
}

关于Android: native 线程与主线程同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10692980/

相关文章:

android - android中的壁纸服务和普通服务

java - Android 内存泄漏问题

java - 从可穿戴设备发送消息到手机,然后立即回复

安卓 NDK- 错误 :Execution failed for task ':app:buildNative'

iphone - 将 iPhone 3-D 游戏代码转换为在 Android 设备上运行的最佳方式?

Android Studio + Liquid Fun

android - 使用 AccountManager addAccountExplicitly 第一次同步需要很长时间

android - NDK r10 b 32 位或 64 位或使用两者编译以及如何实现

java - JNI 检测到 ClassNotFoundException - 但类在 .apk/.dex 中可见?

android - 双卡更改默认 SIM 卡