Простой код для обработки исключений JNI - PullRequest
1 голос
/ 11 марта 2009

Я хотел бы иметь хороший, аккуратный способ выразить следующий код 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 ]

1 голос
/ 11 марта 2009

Чтобы расширить мой комментарий о C против 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").

0 голосов
/ 11 марта 2009

Должен быть лучший способ

Шаблон шаблона, может быть?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...