Android 从C(NDK)调用Thread.yield()或等效程序

Android 从C(NDK)调用Thread.yield()或等效程序,android,c++,c,multithreading,android-ndk,Android,C++,C,Multithreading,Android Ndk,我在Android 2.3.3和SDK 2.2中有一个异步任务 在任务/类中,我使用了一个带有NDK的C库 我没有在Java中使用while(condition)循环,而是在C中使用这个循环,以避免在每次循环迭代期间通过JNI进行昂贵的调用 如果Java中有while(condition)循环,我会在每次循环迭代结束时调用Thread.yield(),以允许线程挂起 在C中是否有可能得到相同的行为? 在C中的while(condition)循环结束时,我用usleep(10)尝试了它,但没有得到

我在Android 2.3.3和SDK 2.2中有一个异步任务

在任务/类中,我使用了一个带有NDK的C库

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

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

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

有什么建议吗?

您可以使用


(根据Steven Bell的评论编辑)

如果真的想从C代码调用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...)    
}

不要忘记错误检查。

您可能希望将C标记添加到问题中,以便订阅该标记的人可以看到它。您是对的。谢谢。我不知道android,但请注意,在某些平台上,“Thread.yield()”、“sched_yield()”、“pthread_yield()”、“Sleep(0)”,或者其他什么,实际上是一个noop。android没有pthread_yield();您必须使用POSIX sched_yield()来代替。@StevenBell这应该是答案