在调用DestroyJavaVM之后,重新调用JNI_CreateJavaVM会返回-1 [英] Re-calling JNI_CreateJavaVM returns -1 after calling DestroyJavaVM

查看:1053
本文介绍了在调用DestroyJavaVM之后,重新调用JNI_CreateJavaVM会返回-1的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在调用DestroyJavaVM之后回忆起JNI_CreateJavaVM。

I am trying to recall JNI_CreateJavaVM after calling DestroyJavaVM.

我按以下顺序调用它们:InitJVM - > ReleaseJVM - > InitJVM

I call them in following order: InitJVM -> ReleaseJVM -> InitJVM

首次初始化时,JNI_CreateJavaVM返回0并正常工作。
第二次在销毁后初始化时,JNI_CreateJavaVM返回-1并且不起作用。

First time when initialing, JNI_CreateJavaVM returns 0 and works fine. second time when initialing after destroying, JNI_CreateJavaVM return -1 and does not work.

会出现什么问题?

这是一个创建JVM的函数:

Here is a function that create JVM:

#elif __linux
HRESULT PWNJava::InitJVM(void) {

    if(m_bRunning) {
        Log("Error : JVM is already Running! (PWNJava::Init)");
        return PWN_FAIL;
    }

    const int kNumOptions = 3;
    JavaVMOption options[kNumOptions] = {
        { const_cast<char*> ("-Xmx128m"), NULL},
        { const_cast<char*> ("-verbose:gc"), NULL},
        { const_cast<char*> ("-Djava.class.path=../../Class"), NULL}
    };

    JavaVMInitArgs vm_args;
    vm_args.version = JNI_VERSION_1_6;
    vm_args.options = options;
    vm_args.nOptions = sizeof (options) / sizeof (JavaVMOption);
    assert(vm_args.nOptions == kNumOptions);

    int res = JNI_CreateJavaVM(&jvm, reinterpret_cast<void**> (&env), &vm_args);
    if (res != JNI_OK) {
        Log("Error : createJavaVM(&jvm, &env, &vm_args)");
        return PWN_FAIL;
    }

    m_bRunning = true;

    Log("Success : PWNJava::Init");

    return PWN_OK;
}

#endif

这是一个删除JVM的函数:

Here is a function deleting JVM:

void PWNJava::ReleaseJVM(void) {

    if (jvm)
        jvm->DestroyJavaVM();

    jvm = NULL;
    delete jvm;

    env = NULL;
    delete env;

    m_bRunning = false;

    Log("Success : PWNJava::ReleaseJVM");

}


推荐答案

上次我看了 JNI_DestroyJVM(),它说但JDK / JRE仍然不支持VM卸载。只是不要调用它,也不要重新初始化它。

Last time I looked at JNI_DestroyJVM(), it said "The JDK/JRE still does not support VM unloading, however." Just don't call it, and don't re-initialize it either.

这篇关于在调用DestroyJavaVM之后,重新调用JNI_CreateJavaVM会返回-1的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆