Вопрос

Я хотел бы иметь приятный, аккуратный способ выражения следующего 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 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").

Другие советы

  

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top