Android 从C(NDK)调用Thread.yield()或等效程序
我在Android 2.3.3和SDK 2.2中有一个异步任务 在任务/类中,我使用了一个带有NDK的C库 我没有在Java中使用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)尝试了它,但没有得到
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这应该是答案