我有一個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