从C(NDK)调用Thread.yield()或等效项

时间:2011-08-04 08:05:42

标签: android c++ c multithreading android-ndk

我在Android 2.3.3中有一个带有SDK 2.2的AsyncTask。

在任务/类中,我正在使用带有NDK的C库。

我没有在Java中使用while(condition)循环,而是在C中使用此循环,以避免在每次循环迭代期间通过JNI进行昂贵的调用。

如果我在Java中有while(condition)循环,我会在每次循环迭代结束时调用Thread.yield()以允许线程被挂起。

C中是否有可能获得相同的行为? 我在C中的usleep(10)循环结束时使用while(condition)尝试了它,但我没有得到预期的行为。

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

如果真的想从C-Code调用Thread.yield(),可以执行以下操作:

Java_de_company_MyClass_setupJNI(JNIEnv* env, jobject thiz) {

    (...snip...)

    jclass threadClass = (*env)->FindClass(env, "java/lang/Thread");
    jmethodID yieldFunctionID = (*env)->GetStaticMethodID(env, threadClass, "yield", "()V");

    (*env)->CallStaticVoidMethod(env, threadClass, yieldFunctionID);

    (...snip...)    
}

不要忘记错误检查。

答案 1 :(得分:2)

您可以使用sched_yield()

(史蒂芬贝尔评论后编辑)