我知道这是一个常见问题,我搜索谷歌并查看前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:.";
现在一切都很好。 感谢
答案 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文件并将它们放在我的项目文件夹中,它现在适用于我。