JNI和取消AsyncTask

时间:2011-11-03 14:07:38

标签: java android java-native-interface android-asynctask

我有一个AsyncTask,而在doInBackground()里面我调用了C函数,它执行了一段时间。当我通过调用 cancel(true)取消我的AsyncTask时,它返回 true - 就像任务被终止一样,但是在“终止”之后我仍然会看到来自C代码的日志语句。 / p>

对我而言,似乎C函数并未真正终止。

我的问题是 - 如何正确终止C函数的执行?

2 个答案:

答案 0 :(得分:3)

找到答案here

这是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 :(得分:1)

当AsyncTask终止时,运行C函数的线程被中断。您需要注意长时间运行的C代码中的中断状态(检查是否已中断?)并手动退出。

修改

查看xuggle(ffmpeg JNI包装器),尤其是csrc/com/xuggle/ferry/JNIHelper.cpp,以获得完整且精心实施的解决方案。