如何使用C ++ jni环境运行springboot应用程序

时间:2019-05-05 11:59:00

标签: java c++ java-native-interface

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

0 个答案:

没有答案