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 대 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
").
다른 팁
더 나은 방법이 있어야합니다
템플릿 패턴이 될 수 있습니까?
제휴하지 않습니다 StackOverflow