簡體   English   中英

JNI和取消AsyncTask

[英]JNI and cancelling AsyncTask

我有一個AsyncTask,在doInBackground()里面我調用了C函數,它執行了一段時間。 當我通過調用cancel(true)取消我的AsyncTask時,它返回true - 就像任務被終止一樣,但是我仍然在“終止”之后看到來自C代碼的日志語句。

對我來說,似乎C函數並沒有真正終止。

我的問題是 - 如何正確終止C函數的執行?

在這里找到答案。

這是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");
    }
}

當AsyncTask終止時,運行C函數的線程被中斷。 您需要注意長時間運行的C代碼中的中斷狀態(檢查是否已中斷?)並手動退出。

編輯:

查看xuggle (ffmpeg JNI包裝器),尤其是csrc/com/xuggle/ferry/JNIHelper.cpp以獲得完整且實現良好的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM