Простой код для обработки исключений JNI
-
08-07-2019 - |
Вопрос
Я хотел бы иметь приятный, аккуратный способ выражения следующего 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
").
Другие советы
Должен быть лучший способ
Шаблон шаблона, может быть?