JNI FindClass无法找到使用jar的类

6

我正在处理一个项目,需要使用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>";

2
我相信 java.library.path 是用于 本地 库(即 .dll.so 文件) - jar 包(我想)应该添加到 java.class.path 中。 - Drew McGowen
@DrewMcGowen 您的意思是选项的第二行必须看起来像这样 options[1].optionString = "-Djava.calss.path=<path_to_my_jar_file>"; 吗? - nabroyan
1
你可以使用路径分隔符(在Windows中为';',在Unix中为':')将它们合并为第一个选项。 - Drew McGowen
真的没有帮到,很遗憾 :( - nabroyan
http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/invocation.html 有一些例子。@nabroyan:请更新您的问题,以便我们可以看到我们是否在谈论同一件事... - Gyro Gearless
显示剩余3条评论
2个回答

11

我认为你的错误在于将JAR文件放在"library.path"上,而library.path只是用于查找本地库文件,而不是JAR文件。

你应该将JAR文件放在类路径(classpath)上,例如:

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

(在Windows中,将“;”用作类路径分隔符,而不是“:”。)


你太棒了。我一直看到语法“.:”但无法推断出点号表示Java类路径的当前目录。你刚刚救了我的一天;非常感谢 :-) - intumwa

1

我发现有两个问题:

1) path_to_my_jar_file

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

2) -Djava.library.path

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接