JNI Env在不同的线程和异常中

时间:2013-10-02 22:41:44

标签: android multithreading android-ndk java-native-interface

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

或者没关系? (请详细说明为什么在这两种情况下)

1 个答案:

答案 0 :(得分:0)

忘掉它的JNI方面。只要考虑一下你正在尝试做什么。如果有帮助就用纯Java来思考它。您正在尝试通过关闭阻止读取的流来取消阻止线程B.所以B会得到例外。

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