JNI- FindClass返回null

时间:2011-09-19 12:22:55

标签: java c++ jvm java-native-interface

我知道这是一个常见问题,我搜索谷歌并查看前4页中的所有内容,尝试了很多可能但目前没有结果。

这是C ++代码部分:

JNIEnv* create_vm(JavaVM ** jvm) {

    char * str=(char *)"-Djava.class.path=.";

    JNIEnv *env;

    JavaVMInitArgs vm_args;

    JavaVMOption options;

    options.optionString = str; //Path to the java source code

    vm_args.version = JNI_VERSION_1_6; //JDK version. This indicates version 1.6

    vm_args.nOptions = 1;

    vm_args.options = &options;

    vm_args.ignoreUnrecognized = 0;



    int ret = JNI_CreateJavaVM(jvm, (void**)&env, &vm_args);

    if(ret < 0)

        printf("\nUnable to Launch JVM\n");     

    return env;

}



int main(int argc, char* argv[])

{

    JNIEnv *env;

    JavaVM * jvm;

    env = create_vm(&jvm);

    if (env == NULL)

        return 1;




    jclass clsMain=NULL;
    jmethodID mid = NULL;

    //Obtaining Classes
    clsMain = env->FindClass("Main");

    //Obtaining Method IDs
    if (clsMain != NULL)
    {
        mid       = env->GetStaticMethodID(clsMain, "myMethod", "(Ljava/lang/String;)Z");
    }
    else
    {
        printf("\nUnable to find the requested class\n");    //this runs    
    }

...

我不知道如何捕获异常并在JNI中学习它的名字。

此外,Main.class与该文件具有此C ++代码部分位于同一目录中。


修改

我添加这些行以在FindClass行之后从Java中查找异常:

clsMain = env->FindClass("Main");

jthrowable exc;
exc = env->ExceptionOccurred();
     if (exc) {
         jclass newExcCls;
         env->ExceptionDescribe();
         env->ExceptionClear();

     }

然后抛出NoClassDefFoundException

因此我编辑了JavaVMInitArgs.options

我的意思是我编辑:

char * str=(char *)"-Djava.class.path=.";

行到:

 char * str=(char *)"-Djava.class.path=/path/to/my/jars:/path/to/my/other/jars:."; 

现在一切都很好。 感谢

3 个答案:

答案 0 :(得分:1)

当JVM在运行时无法找到类并且compîler在编译时找到该类时,会发生NoClassDefFoundError。

因此,您的问题可能是Java代码内容和/或类路径定义的问题。您的Java代码可能正在调用当前目录中不可用的类。

您应该做的是创建一个包含JNI调用所需内容的jar文件。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我在Mac上尝试了上面提到的方法但它没有用。最后,我解压缩了我的jar文件并将它们放在我的项目文件夹中,它现在适用于我。