JNI и отмена AsyncTask - PullRequest
       1

JNI и отмена AsyncTask

3 голосов
/ 03 ноября 2011

У меня есть AsyncTask, и внутри doInBackground () я вызываю функцию C, которая выполняется некоторое время.Когда я отменяю свой AsyncTask, вызывая cancel (true) , он возвращает true - задача, похожая на, была прервана, однако после «завершения» я все еще вижу операторы журнала из кода C.

Мне кажется, что функция C на самом деле не завершена.

Мой вопрос - как правильно завершить выполнение функции C?

Ответы [ 2 ]

3 голосов
/ 03 ноября 2011

Найден ответ здесь .

Вот версия C:

jclass thread = (*env)->FindClass(env, "java/lang/Thread");
jmethodID mCurThread = (*env)->GetStaticMethodID(env, thread, "currentThread", "()Ljava/lang/Thread;");
jmethodID mIsInterrupted = (*env)->GetMethodID(env, thread, "isInterrupted", "()Z");
jobject curThread = (jobject)(*env)->CallStaticObjectMethod(env, thread, mCurThread);

for (;;) {
    // do some stuff
    jboolean res = (jboolean)(*env)->CallBooleanMethod(env, curThread, mIsInterrupted);
    if (res == JNI_TRUE) {
        LOGI("INTERRUPTED");
    } else {
        LOGI("WORKING");
    }
}
1 голос
/ 03 ноября 2011

Когда AsyncTask завершается, поток, в котором выполняется ваша функция C, прерывается. Вам необходимо обратить внимание на состояние прерывания в вашем долговременном коде C (проверьте isInterrupted?) И выйти вручную.

Edit:

Проверьте xuggle (обертка ffmpeg JNI), особенно csrc/com/xuggle/ferry/JNIHelper.cpp для полного и красиво реализованного решения.

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