在我的应用程序中无法正常调用FindClass
时遇到一些麻烦。我在这个问题上查询了很多问题,但是这些问题都没有解决我的问题...
JVM创建代码:
JavaVM *test_jvm;
JNIEnv *test_jenv;
JavaVMInitArgs vm_args; /* JDK 1.1 VM initialization arguments */
JNI_GetDefaultJavaVMInitArgs(&vm_args);
JavaVMOption options[1];
options[0].optionString = classpath;
vm_args.version = JNI_VERSION_1_4; /* New in 1.1.2: VM version */
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = false;
jint ret = JNI_CreateJavaVM(&test_jvm, reinterpret_cast<void**>(&test_jenv), &vm_args);
assert(ret == JNI_OK);
assert(test_jenv->FindClass("my/package/MyClass") != 0);
classpath
的定义:
char classpath[] = "-Djava.class.path=lib/somejar1.jar:"
"bin:"
"lib/somejar2.jar:"
"lib/somejar3.jar";
当我运行此代码时,assert()
代码失败,但是当我在同一位置运行此代码时:
java -cp lib/somejar1.jar:bin:lib/somejar2.jar:lib/somejar3.jar my.package.MyClass
...一切正常。
我正在加载的类非常简单:
package my.package;
public class MyClass {
public static void main(String[] args) {
System.out.println("Hello World!");
}
};
我也尝试了不使用main
方法的情况,但是结果是相同的。我可以毫无问题地从JAR加载类,但不能从bin
目录加载这一类...
我检查了很多问题,但是其中大多数是关于不正确的类路径或不正确的命名约定的。我仔细检查了所有内容,但没有发现任何问题。
其他一些答案提到了线程问题,但是由于我是从C ++环境创建JVM,所以我不这样做吗?即使这样做,对FindClass
的调用应该不会有问题吗?
我真的很希望能找到解决方案,或者至少是一种更深入地调试正在发生的事情的方法...
答案 0 :(得分:0)
免责声明:我找到了问题的根源,并且我写此答案是因为我没有找到与FindClass
相关的问题的典型答案。
问题是用于编译java
文件的javac
可执行文件的.java
版本(Java 1.7,计算机上的标准Java安装)与该版本之间存在差异。 JNI代码(OpenJDK 1.5,自定义安装)。
一旦我使用正确的javac
可执行文件编译了Java文件,代码就可以正常工作了。