문제

다음 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").

다른 팁

더 나은 방법이 있어야합니다

템플릿 패턴이 될 수 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top