处理JNI异常的简单代码

时间:2009-03-10 22:31:03

标签: java java-native-interface

我想以一种漂亮,整洁的方式将以下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不感兴趣,所以我想要一个可以在本土实现的模式,可以这么说。

2 个答案:

答案 0 :(得分:1)

扩展我对C vs C ++的评论。

我会在C ++中尝试这样的事情(nb:完全未经测试,可能不会按原样编译!

class JavaClass {

    private:
        jclass cls;
        JNIEnv *env;

    public:
        JavaClass(JNIEnv *env, const char *className) {
            this.env = env;
            cls = env->FindClass(className);
            // handle errors
        }

        ~JavaClass() {
            env->DeleteLocalRef(cls);
        }

        bool isInstanceOf(jobject obj) {
            return env->IsInstanceOf(obj, cls);
        }
};

客户端代码看起来像:

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();
    }
}

(请注意,此isInstanceOf()函数的语义是低音 - 在这一个中它是“class.instanceof(object)”,而不是“object instanceof class”。

答案 1 :(得分:-1)

  

必须有更好的方法

模板模式,可能是?