Java 处理JNI异常的简单代码

Java 处理JNI异常的简单代码,java,java-native-interface,Java,Java Native Interface,我想用一种漂亮、整洁的方式将以下java代码表示为JNI: try { SomeMethod (); } catch (ExceptionType1 e) { SomeAction (); } catch (ExceptionType2 e) { SomeAction (); } catch (ExceptionType3 e) { SomeAction (); } 这样做是否有一个整洁的JNI模式?目前,我有: java_class = (*env)->

我想用一种漂亮、整洁的方式将以下java代码表示为JNI:

try {
    SomeMethod ();
}
catch (ExceptionType1 e) {
    SomeAction ();
}
catch (ExceptionType2 e) {
    SomeAction ();
}
catch (ExceptionType3 e) {
    SomeAction ();
}
这样做是否有一个整洁的JNI模式?目前,我有:

java_class = (*env)->FindClass (env, EXCEPTION_CLASS_NAME);
if (java_class == NULL) {
    *error_type_ref = ERROR_TYPE_FATAL;
    *exception_code_ref = EU_StrSprintf ("Class not found: %s", EXCEPTION_CLASS_NAME);
    cleanup ();
}
if ((*env)->IsInstanceOf (env, exception, java_class)) {
    SomeAction ();
    cleanup ();
}
当然,对于这样处理的每个异常,都会再次发生这种情况。一定有更好的办法。有什么建议吗?我对将所有现有代码移植到JNA不感兴趣,所以我想要一个可以在本地实现的模式

一定有更好的办法


在我对C VC++的评论中,扩展模板模式,可以是

< P>。 <>我会尝试C++中的这种东西(NB:完全未经测试,可能不按原样编译)< /P> 然后,客户端代码将类似于:

JavaClass ext1(env, "ExceptionType1");
JavaClass ext2(env, "ExceptionType2");
JavaClass ext3(env, "ExceptionType3");

SomeMethod();

if (ex = env->ExceptionOccurred()) {
    if (ext1.isInstanceOf(ex)) {
        doSomething();
    } else if (ext2.isInstanceOf(ex)) {
        doSomething();
    } else if (ext3.isInstanceOf(ex)) {
        doSomething();
    }
}

(注意,这个代码> ISSITANSO())/>代码函数是BASS AcKEDE——在这一点中,它是“<代码>类(对象)< /COD>”,而不是“<代码>对象的类< /COD> >)。< /P>您是否使用C或C++来执行JNI代码?我自己的JNI经验告诉我,在RAII模式中使用C++对象有助于JNI,例如当事情超出范围时,它更容易自动清理。这显然是一个好的解决方案,我的编程语言是无用的:C:哦,你不能让每个人满意。

JavaClass ext1(env, "ExceptionType1");
JavaClass ext2(env, "ExceptionType2");
JavaClass ext3(env, "ExceptionType3");

SomeMethod();

if (ex = env->ExceptionOccurred()) {
    if (ext1.isInstanceOf(ex)) {
        doSomething();
    } else if (ext2.isInstanceOf(ex)) {
        doSomething();
    } else if (ext3.isInstanceOf(ex)) {
        doSomething();
    }
}