有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案