código simples para lidar com exceções JNI
-
08-07-2019 - |
Pergunta
Eu gostaria de ter uma maneira agradável, arrumado de expressar o seguinte código java como JNI:
try {
SomeMethod ();
}
catch (ExceptionType1 e) {
SomeAction ();
}
catch (ExceptionType2 e) {
SomeAction ();
}
catch (ExceptionType3 e) {
SomeAction ();
}
Existe uma patter JNI arrumado para fazer isso? No momento, eu tenho este:
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 ();
}
E, é claro, isso se repete para cada exceção para manipulados. Tem que haver uma maneira melhor. Quaisquer recomendações? Eu não estou interessado em portar todo o meu código existente sobre a ANJ, então eu gostaria de um padrão que pode ser implementado home-grown, por assim dizer.
Solução
Para expandir no meu comentário no C vs C ++.
Eu tentaria algo como isso em C ++ (nb: completamente testado, e provavelmente não compila como é )
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);
}
};
O código do cliente, então, algo como:
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();
}
}
(Note que a semântica desta função isInstanceOf()
são bass-ackwards - em um presente que é "class.instanceof(object)
", em vez de "object instanceof class
").
Outras dicas
Tem que haver uma maneira melhor
padrão de modelo, pode ser?