JNI FindClass 找不到使用 jar 的类

JNI FindClass can't find class which uses jar

本文关键字:jar 的类 FindClass 找不到 JNI      更新时间:2023-10-16

我正在做一个项目,其中必须使用 JNI 从C++代码调用一些 Java 函数。我已经用一个简单的Java类尝试过,但是当我开始在我的Java项目中使用额外的.jar时,JNI的FindClass函数找不到我的类。我已经做了一些研究并阅读了classpath如果文件使用额外的库,编译文件需要.java,但在这种情况下FindClass返回null。这是我的代码的基本结构

JavaVMOption options[2];
JNIEnv *env;
JavaVM *jvm;
JavaVMInitArgs vm_args;
long status;
jclass cls;
jmethodID mid;
jint square;
jboolean not;
options[0].optionString = "-Djava.class.path=<path_to_my_java_class>";
options[1].optionString = "-Djava.library.path=<path_to_my_jar_file>";
memset(&vm_args, 0, sizeof(vm_args));
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 2;
vm_args.options = options;
status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if (status != JNI_ERR)
{
    cls = env->FindClass("package/ClassName"); //returns null while using jar
    if(cls != 0)
    {   
        //do some stuff
    }
    jvm->DestroyJavaVM();
    return 0;
}
else
    return -1;

有什么想法吗?

更新:我也试过

options[0].optionString = "-Djava.class.path=<path_to_my_java_class>;<path_to_jar>";
    options[0].optionString = "-Djava.class.path=<path_to_my_java_class>";
    options[1].optionString = "-classpath <path_to_jar>";

我认为你的错误是你在"library.path"上放了一个JAR。 库路径是查找本机库的路径...不是 JAR 文件。

您应该将 JAR 文件放在类路径上;例如

    options[0].optionString = 
        "-Djava.class.path=<path_to_my_java_class>:<path_to_my_jar_file>";

(在 Windows 上,使用 ";" 作为类路径分隔符,而不是 ":"。

我发现,有 2 个问题

1( path_to_my_jar_file

此路径必须指向 jar 文件,而不是包含该文件的目录文件夹。

2( -Djava.library.path

Drew McGowen的评论和Stephen C的回答是正确的 - jar文件的路径必须像他们所说的那样。