2011-09-19 123 views
1

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

这里是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:."; 

现在一切都很好。 谢谢

+1

你可以调用'ExceptionOccurred'或'ExceptionDescribe';这些记录在JNI规范中。 – parsifal

+1

您的主课程是否在指定的包装中? –

+0

@ THomas-Cramer;不,它不在命名或未命名的软件包中。我可以得到它关于我的一个库的异常,这是我的类路径中的路径。我得到NoClassDefFoundError。在网上有一条评论:“** NoClassDefFoundError是在编译时在Java Classpath中存在特定类时出现的,但是在运行时在Java类中的Classpath中不可用。**”这是什么意思,它在我的classpath中还有什么我可不可以做? – merveotesi

回答

1

当JVM在运行时无法找到某个类时,NoClassDefFoundError发生,并且该类在编译时尚未找到。

所以你的问题可能是关于你的Java代码的内容和/或你的类路径的定义问题。您的Java代码可能调用了当前目录中不可用的类。

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

0

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

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

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