2011-09-19 88 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文件,並將它們放到了我的項目文件夾中,現在它適用於我。