我有一个AsyncTask,并在doInBackground()内我调用C函数,它执行一段时间。当我通过调用取消(true)来取消我的AsyncTask时,它返回true - 类似的任务被终止了,但是我终于在“终止”之后看到来自C代码的日志语句。JNI和取消AsyncTask
对我来说,似乎C函数并没有真正终止。
我的问题是 - 如何正确终止C函数的执行?
我有一个AsyncTask,并在doInBackground()内我调用C函数,它执行一段时间。当我通过调用取消(true)来取消我的AsyncTask时,它返回true - 类似的任务被终止了,但是我终于在“终止”之后看到来自C代码的日志语句。JNI和取消AsyncTask
对我来说,似乎C函数并没有真正终止。
我的问题是 - 如何正确终止C函数的执行?
找到的答案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");
}
}
之后不要忘记为'curThread'和'thread'调用'(* env) - > DeleteLocalRef(env,..)',否则会看到PSS持续增长的内存泄漏。 – ymonad