关于jvm:C启动JVM
性能介绍1. C++启动Java虚拟机2. 通过C++指针调用main办法环境JDK: jdk-17.0.9mingw-w64: x86_64-8.1.0-release-win32-seh-rt_v6-rev0 实现过程1. 编写cpp程序StartJVM.cpp #include <jni.h> // JNI header provided by JDK#include <stdio.h> // C Standard IO Header#include <windows.h>int main() { JavaVM *jvm; // Pointer to the JVM (Java Virtual Machine) JNIEnv *env; // Pointer to native interface // JVM initialization arguments JavaVMInitArgs vm_args; JavaVMOption* options = new JavaVMOption[3]; options[0].optionString = (char*) "-Djava.class.path=D:/SDK/jdk-17.0.9/lib;."; // 设置你的类门路 (classpath),这里只是一个例子 options[1].optionString = (char*) "-Xmn512m"; options[2].optionString = (char*) "-Xmx1g"; // options[3].optionString = (char*) "-Djava.library.path=D:/SDK/jdk-17.0.9/bin"; vm_args.version = JNI_VERSION_10; // JVM version. This indicates version 1.6 vm_args.nOptions = 3; vm_args.options = options; vm_args.ignoreUnrecognized = JNI_TRUE; printf("JNI_CreateJavaVM %s\n", options[0].optionString); HINSTANCE hVM = LoadLibrary("D:\\SDK\\jdk-17.0.9\\bin\\server\\jvm.dll"); if (hVM == NULL) { printf("Load failed.."); } typedef jint (CALLBACK *fpCJV)(JavaVM**, void**, JavaVMInitArgs*); fpCJV CreateJavaVM = (fpCJV)GetProcAddress(hVM, "JNI_CreateJavaVM"); jint rc = CreateJavaVM(&jvm, (void**)&env, &vm_args); // 加载并初始化一个JVM,"jvm"是返回的JVM接口的指针,"env"是返回的JNI接口的指针 //jint rc = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); printf("JNI_CreateJavaVM Finished!\n"); if (rc != JNI_OK) { if (rc == JNI_EVERSION) { fprintf(stderr, "FATAL ERROR: JVM is oudated and doesn't meet requirements"); } else if (rc == JNI_ENOMEM) { fprintf(stderr, "FATAL ERROR: Not enough memory for JVM"); } else if (rc == JNI_EINVAL) { fprintf(stderr, "FATAL ERROR: invalid ragument for launching JVM"); } else if (rc == JNI_EEXIST) { fprintf(stderr, "FATAL ERROR: the process can only launch one JVM an not multiple"); } else { fprintf(stderr, "FATAL ERROR: unknown error"); } return rc; } else { printf("JVM load succeeded. Version\n"); } // 在这里你能够开始调用Java代码 ... printf("可用调用Java了\n"); /* invoke the Main.test method using the JNI */ jclass cls = env->FindClass("JavaMain"); jmethodID mid = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V"); env->CallStaticVoidMethod(cls, mid, 100); // 敞开JVM jvm->DestroyJavaVM(); return 0;}JavaMain.java ...