我在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)
尝试了它,但我没有得到预期的行为。
有什么建议吗?
答案 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()
(史蒂芬贝尔评论后编辑)