1

假设我有两个本机线程,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

还是没关系?(请详细说明原因)

4

1 回答 1

0

忘记它的 JNI 方面。只需考虑您要尝试做什么。如果有帮助,请在纯 Java 中考虑它。您正试图通过关闭它被阻止读取的流来解除线程 B 的阻塞。所以B会得到一个例外。

实际上,两个线程都应该在每次JNI 调用之后调用“ExceptionOccurred()” ,而不仅仅是那些你“期望”异常的线程。但是线程 B 会得到这个异常。

于 2013-10-02T23:52:44.337 回答