gpt4 book ai didi

java - 处理JNI异常的简单代码

转载 作者:行者123 更新时间:2023-12-01 06:00:22 27 4
gpt4 key购买 nike

我想要一种漂亮、整洁的方式将以下 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++ 中尝试类似的方法(注意:完全未经测试,并且可能无法按原样编译!)

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)”,而不是“类的对象实例”)。

关于java - 处理JNI异常的简单代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/632546/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com