假设我有两个本机线程,A 和 B。在线程 AI 中,使用 JNI 方法通过调用 java 方法(构造函数、静态方法等)来获取 Java 对象并获取对它的全局引用。
java_vm->AttachCurrentThread(&env,NULL);
j_ref_inputStream = env->CallObjectMethod(g_j_ref_btSocket,j_mid_getInputStream);
g_j_ref_inputStream = env->NewGlobalRef(j_ref_inputStream);
现在我将我的全局引用传递给线程 B,在那里我调用了一个方法:
java_vm->AttachCurrentThread(&env2,NULL);
jint b = env2->CallIntMethod(g_j_ref_inputStream,j_mid_read);
在 InputStream 上调用 read() 将阻塞线程 B(对吗?)。要强制解除阻塞 Thread BI 可以尝试生成 IOException。所以在 Thread AI 中:
env->callVoidMethod(g_j_ref_btSocket,j_mid_close);
但是我在哪里捕捉到这个异常?我对 JNI 和本机线程不太清楚。我是否在线程 A 中调用以下内容:
j_exception = env->ExceptionOccurred();
if(j_exception) // handle exception
或者在线程 B 中:
j_exception = env2->ExceptionOccurred();
if(j_exception) // handle exception
还是没关系?(请详细说明原因)