FindClass找不到类

时间:2018-08-14 15:03:19

标签: java-native-interface

在我的应用程序中无法正常调用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的调用应该不会有问题吗?

我真的很希望能找到解决方案,或者至少是一种更深入地调试正在发生的事情的方法...

1 个答案:

答案 0 :(得分:0)

免责声明:我找到了问题的根源,并且我写此答案是因为我没有找到与FindClass相关的问题的典型答案。

问题是用于编译java文件的javac可执行文件的.java版本(Java 1.7,计算机上的标准Java安装)与该版本之间存在差异。 JNI代码(OpenJDK 1.5,自定义安装)。

一旦我使用正确的javac可执行文件编译了Java文件,代码就可以正常工作了。