質問
次の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)
" " objectinstofクラス
")。
他のヒント
より良い方法が必要です
テンプレートパターン、そうかもしれませんか?
所属していません StackOverflow