有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JNI和取消异步任务

我有一个AsyncTask,在doInBackground()中我调用C函数,该函数执行一段时间。当我通过调用cancel(true)取消异步任务时,它返回true——就像任务被终止一样,但在“终止”之后我仍然可以看到C代码中的日志语句

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

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


共 (2) 个答案

  1. # 1 楼答案

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

    编辑:

    查看xuggle(ffmpeg JNI包装器),尤其是csrc/com/xuggle/ferry/JNIHelper.cpp以获得完整且实现良好的解决方案

  2. # 2 楼答案

    找到了答案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");
        }
    }