假设我有两个本机线程,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(对吗?)。要强制取消阻止线程B,我可以尝试生成IOException。所以在线程A我做:
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
或者没关系? (请详细说明为什么在这两种情况下)
答案 0 :(得分:0)
忘掉它的JNI方面。只要考虑一下你正在尝试做什么。如果有帮助就用纯Java来思考它。您正在尝试通过关闭阻止读取的流来取消阻止线程B.所以B会得到例外。
实际上两个线程都应该在每次 JNI调用之后调用'ExceptionOccurred()',而不仅仅是那些你期望'异常的'。但是线程B会得到这个例外。