java JNI:您打算如何处理FindClass失败?
我有一个JNI库,它在加载时执行许多这样的代码块:
jclass id_Collection = global_ref_to_class(env, "java/util/Collection");
jmethodID id_Collection_add = env->GetMethodID(ids.Collection, "add", "(Ljava/lang/Object;)Z");
jmethodID id_Collection_iterator = env->GetMethodID(ids.Collection, "iterator", "()Ljava/util/Iterator;");
其中global_ref_to_class
是包装env->FindClass
的辅助函数:
jclass global_ref_to_class(JNIEnv* env, string name) {
jclass class_id = env->FindClass(name.c_str());
// We need to store a Java 'global reference' to the class to stop it being moved.
jclass result = static_cast<jclass>(env->NewGlobalRef(class_id));
env->DeleteLocalRef(class_id);
return result;
}
现在,问题发生在env->FindClass
失败时。特别是:
当运行时找不到java标准库时,对env->GetMethodID
的后续调用会导致segfault
我在网上找到的代码示例中没有一个能够处理这种情况。我是不是要穿过每一个街区,修改成
jclass id_Collection = global_ref_to_class(env, "java/util/Collection");
if(id_Collection != NULL) {
jmethodID id_Collection_add = env->GetMethodID(ids.Collection, "add", "(Ljava/lang/Object;)Z");
jmethodID id_Collection_iterator = env->GetMethodID(ids.Collection, "iterator", "()Ljava/util/Iterator;");
}
??这感觉很笨重
帮助人们搜索:根据系统的不同,错误可能是异常访问违反SIGSEGV
共 (0) 个答案