我知道這是一個常見問題,我搜索谷歌並查看前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:.";
現在一切都很好。 謝謝
你可以調用'ExceptionOccurred'或'ExceptionDescribe';這些記錄在JNI規範中。 – parsifal
您的主課程是否在指定的包裝中? –
@ THomas-Cramer;不,它不在命名或未命名的軟件包中。我可以得到它關於我的一個庫的異常,這是我的類路徑中的路徑。我得到NoClassDefFoundError。在網上有一條評論:「** NoClassDefFoundError是在編譯時在Java Classpath中存在特定類時出現的,但是在運行時在Java類中的Classpath中不可用。**」這是什麼意思,它在我的classpath中還有什麼我可不可以做? – merveotesi