在C中,直接使用JNI加载虚拟机,也是很有意思的想法。这个工作不难,吾已经完成了。
可用代码参考
用C产生加载JDK产生JVM虚拟机,并运行JAVA的main函数(MACOS/LINUX/WINDOWS)_柳鲲鹏的博客-CSDN博客
WINDOWS
实际上代码也有,一时没有整理(主要是加载库方式不同)。可以参考:
C/C++启动JVM_Dan淡淡的心的博客-CSDN博客_c++ jvm
未测试的代码
下面这个代码不是我的代码,没有真正测试过。以后有机会再测试。
#include <jni.h> using namespace std; int main(const int argc, const char** argv) { JavaVMOption options[7]; JNIEnv *env; JavaVM *jvm; JavaVMInitArgs vm_args; options[0].optionString = "-XX:+UseG1GC"; options[1].optionString = "-XX:-UseAdaptiveSizePolicy"; options[2].optionString = "-XX:-OmitStackTraceInFastThrow"; options[3].optionString = "-Xmn512m"; options[4].optionString = "-Xmx2048m"; options[5].optionString = "-Djava.library.path=natives"; options[6].optionString = "-Djava.class.path=.;libraries.zip;main.jar"; std::memset(&vm_args, 0, sizeof(vm_args)); vm_args.version = JNI_VERSION_1_8; vm_args.nOptions = 7; vm_args.options = options; cout << "start creat jvm!\n"; long status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); if (status == JNI_ERR) { return 0; } cout << "jvm created success\n"; jclass cls = env->FindClass("main/Main"); if (cls != NULL) { jmethodID mid = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V"); if (mid != NULL) { jclass clz_string = env->FindClass("java/lang/String"); jobjectArray result = env->NewObjectArray(2, clz_string, NULL); jstring arg0 = env->NewStringUTF("first"); env->SetObjectArrayElement(result, 0, arg0); jstring arg1 = env->NewStringUTF("second"); env->SetObjectArrayElement(result, 1, arg1); env->CallStaticVoidMethod(cls, mid, result); } else { cout << "class not found\n"; } jvm->DestroyJavaVM(); return 0; }