2011-11-03 47 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