如何使用C JNI环境运行Springboot应用程序
How to run a springboot application using C++ jni environment
我正在尝试使用以下代码使用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.clononotsupportedException。运行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)
从 @mister_jeusu的评论中启发,我尝试了一下。它对我有用。
int RunSpring(JavaVM * jvm, JNIEnv * env)
{
/* Run app */
jclass class = (*env)->FindClass(env, "org/springframework/boot/loader/JarLauncher");
if (!class)
{
PRINT_LINENO;
return -1;
}
jmethodID mid = (*env)->GetStaticMethodID(env, class, "main", "([Ljava/lang/String;)V");
if (!mid)
{
PRINT_LINENO;
return -1;
}
(*env)->CallStaticVoidMethod(env, class, mid, NULL);
return 0;
}
相关文章:
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 代码在main()中运行,但在函数中出现错误
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何在运行中期切换GTK CSS style_context
- 如何在MS Visual Studio 2019中运行QT UI
- 如何通过cpp程序运行shell脚本
- IPC使用多个管道和分支进程来运行Python程序
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- c++中的指针和运行时错误
- 在C应用程序中运行C++(带有STL)函数
- 运行程序时出现问题
- 控制允许动态运行c++的并发操作数
- 如何使用C JNI环境运行Springboot应用程序