我试图在c程序中使用一个相当复杂的java程序。让我澄清一下,我对java了解不多,所以我希望我不会过度解释java或者说一些关于java的废话。
为了我的目的,我正在使用jni。jvm的创建工作得很好,我已经能够成功地调用c程序中的简单类,即编译成类的单个java文件,包含在与我的cpp相同的目录中,没有依赖关系。
现在,我愿意从一个java程序中调用方法,该程序是1。是包的一部分,2。在包之外有很多依赖关系,3。没有主管道。
我的想法是首先在eclipse中构建一个包的“runnable jar”,我想从中调用方法,假设它包含外部依赖项。
我不太清楚jar是怎么工作的,所以我可能在这方面错了,或者在这个过程中犯了错误。我可能在某种程度上不包括所有的依赖?这是我目前的假设,但是我怎么能检查并得到比下面显示的异常告诉我的更多的细节呢?我还假设我想要使用类的包没有main是可以的,因为最终我只想使用一个方法,但是我可能在这里也错了。
所以我将这个jar的路径添加到类路径中,如c++所示:
options[0].optionString = "-Djava.class.path=C:\\Users\\anker\\source\\repos\\mc_solver\\target\jars\\package_name.jar";
他的程序如下:
...
JavaVM *jvm;
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption* options = new JavaVMOption[1];
options[0].optionString = "-Djava.class.path=C:\\Users\\anker\\source\\repos\\mc_solver\\target\jars\\package_name.jar";
vm_args.version = JNI_VERSION_1_8;
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = false;
jint rc = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
delete options; //
if (rc != JNI_OK) {
cin.get();
exit(EXIT_FAILURE);
}
//=============== Display JVM version =======================================
cout << "JVM load succeeded: Version ";
jint ver = env->GetVersion();
cout << ((ver >> 16) & 0x0f) << "." << (ver & 0x0f) << endl;
jclass cls2 = env->FindClass("package_name/class_name");
if (cls2 == nullptr) {
if (env->ExceptionOccurred()) {
env->ExceptionDescribe();
}
cerr << "ERROR: class not found !";
}
...
以及 env->ExceptionDescribe();
告诉我:
Exception in thread "main" java.lang.NoClassDefFoundError: package_name/class_name
Caused by: java.lang.ClassNotFoundException: package_name.class_name
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
非常感谢您的关注,您有什么建议?
暂无答案!
目前还没有任何答案,快来回答吧!