java - JNI 和取消 AsyncTask

标签 java android java-native-interface android-asynctask

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

对我来说,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");
    }
}

关于java - JNI 和取消 AsyncTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7996255/

相关文章:

java - Android 服务未接收来自 Activity 的消息

java - 多类对象渲染顺序

java - Apache POI 超链接无法在 Microsoft Excel 中打开

java - 数据库名称包含正斜杠的 PostgreSQL JDBC URL

android - 适用于手机/平板电脑的 Tableau 仪表板

android - 从命令行运行 "Instant Run"

android - 卸载应用程序时 GCM 未注销设备

java - 安卓 Jni : Fastest way to pass a Map from Java to C++?

java - JVM 最大堆大小参数在通过 C++ 实例化时不起作用

java - 在 native 代码中处理信号 - 在终端中使用 SIGSEGV 导致 JVM 崩溃