我正在尝试使用以下代码使用C ++ jni lib运行springboot应用程序jar文件:
void init_jni() {
const int kNumOptions = 1;
JavaVMOption options[kNumOptions] = {
{const_cast<char *>("-Djava.class.path=app-0.0.1-SNAPSHOT.jar"), nullptr},
};
JavaVMInitArgs vmArgs = {
JNI_VERSION_1_8, kNumOptions, options, JNI_TRUE
};
// Create the JVM
JavaVM *javaVM;
JNIEnv *jniEnv;
long flag = JNI_CreateJavaVM(&javaVM, (void **) &jniEnv, &vmArgs);
if (flag == JNI_ERR) {
cout << "Error creating VM. Exiting...\n";
exit(1);
}
jclass jcls = jniEnv->FindClass("org/springframework/boot/loader/JarLauncher");
if (jcls == nullptr) {
jniEnv->ExceptionDescribe();
javaVM->DestroyJavaVM();
exit(1);
}
jmethodID methodId = jniEnv->GetStaticMethodID(jcls, "main", "([Ljava/lang/String;)V");
if (methodId == nullptr) {
jniEnv->ExceptionDescribe();
javaVM->DestroyJavaVM();
exit(1);
}
jniEnv->CallStaticVoidMethod(jcls, methodId);
if (jniEnv->ExceptionCheck()) {
jniEnv->ExceptionDescribe();
jniEnv->ExceptionClear();
}
javaVM->DestroyJavaVM();
}
当我调用上面的init_jni
方法时,我得到了java.lang.CloneNotSupportedException。
通过终端运行java -jar app-0.0.1-SNAPSHOT.jar
可以正常工作。
我还有什么要做的吗?
这是抛出的异常:
Exception in thread "main" java.lang.CloneNotSupportedException: java.lang.Class
at java.lang.Object.clone(Native Method)
at org.springframework.boot.loader.MainMethodRunner.<init>(MainMethodRunner.java:41)
at org.springframework.boot.loader.Launcher.createMainMethodRunner(Launcher.java:99)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)