如何使用C JNI环境运行Springboot应用程序

How to run a springboot application using C++ jni environment

本文关键字:运行 Springboot 应用程序 环境 JNI 何使用      更新时间:2023-10-16

我正在尝试使用以下代码使用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;
}