在C中,直接使用JNI加载虚拟机,也是很有意思的想法。这个工作不难,吾已经完成了。
- 可用代码参考
用C产生加载JDK产生JVM虚拟机,并运行JAVA的main函数(MACOS/LINUX/WINDOWS)_柳鲲鹏的博客-CSDN博客
- WINDOWS
实际上代码也有,一时没有整理(主要是加载库方式不同)。可以参考:
C/C++启动JVM_Dan淡淡的心的博客-CSDN博客_c++ jvm
- 未测试的代码
下面这个代码不是我的代码,没有真正测试过。以后有机会再测试。
#include
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 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 DestroyJavaVM();
return 0;
}