2011-11-03 62 views
3

我有一个AsyncTask,并在doInBackground()内我调用C函数,它执行一段时间。当我通过调用取消(true)来取消我的AsyncTask时,它返回true - 类似的任务被终止了,但是我终于在“终止”之后看到来自C代码的日志语句。JNI和取消AsyncTask

对我来说,似乎C函数并没有真正终止。

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

回答

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"); 
    } 
} 
+0

之后不要忘记为'curThread'和'thread'调用'(* env) - > DeleteLocalRef(env,..)',否则会看到PSS持续增长的内存泄漏。 – ymonad

1

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

编辑:

退房xuggle(JNI的ffmpeg包装),一个完整的,并很好地实施的解决方案尤其是csrc/com/xuggle/ferry/JNIHelper.cpp

+0

你能给调用isInterrupted的例子吗? – lstipakov