Вызовите Thread.yield () или эквивалент из C (NDK) - PullRequest
2 голосов
/ 04 августа 2011

У меня есть AsyncTask в Android 2.3.3 с SDK 2.2.

В рамках задачи / класса я использую C-библиотеку с NDK.

Вместо того, чтобы иметь цикл while(condition) в Java, у меня есть этот цикл в C, чтобы избежать дорогих вызовов через JNI во время каждой итерации цикла.

Если бы у меня был цикл while(condition) в Java, я бы вызывал Thread.yield() в конце каждой итерации цикла, чтобы позволить потоку приостановиться.

Есть ли в C возможность получить такое же поведение? Я пробовал это с usleep(10) в конце цикла while(condition) в C, но я не получил ожидаемого поведения.

Есть предложения?

Ответы [ 2 ]

3 голосов
/ 05 августа 2011

Если вы действительно хотите вызвать Thread.yield () из C-кода, вы можете сделать следующее:

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...)    
}

Не забудьте проверить ошибки.

2 голосов
/ 04 августа 2011

Вы можете использовать sched_yield ()

(отредактировано после комментария Стивена Белла)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...