1

次の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 に移植することに興味はないので、いわば自作で実装できるパターンが必要です。

4

2 に答える 2

1

C と C++ に関する私のコメントを拡張します。

私はC ++でこのようなことを試してみます(注意:完全にテストされておらず、おそらくそのままではコンパイルされません!

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" です)。

于 2009-03-10T23:40:08.603 に答える
-1

もっと良い方法があるはずです

テンプレートのパターンですか?

于 2009-03-10T23:09:22.330 に答える