您当前的位置: 首页 >  Java

柳鲲鹏

暂无认证

  • 0浏览

    0关注

    4642博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

使用JNI加载JAVA虚拟机

柳鲲鹏 发布时间:2019-05-18 19:46:27 ,浏览量:0

  在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;
}

关注
打赏
1665724893
查看更多评论
立即登录/注册

微信扫码登录

0.0589s