2

DestroyJavaVM を呼び出した後、JNI_CreateJavaVM を呼び戻そうとしています。

次の順序で呼び出します: InitJVM -> ReleaseJVM -> InitJVM

初めて初期化するとき、JNI_CreateJavaVM は 0 を返し、正常に動作します。破棄後の 2 回目の初期化では、JNI_CreateJavaVM は -1 を返し、機能しません。

問題は何でしょうか?

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を削除する関数は次のとおりです。

void PWNJava::ReleaseJVM(void) {

    if (jvm)
        jvm->DestroyJavaVM();

    jvm = NULL;
    delete jvm;

    env = NULL;
    delete env;

    m_bRunning = false;

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

}
4

1 に答える 1

2

前回 を見たときJNI_DestroyJVM()「ただし、JDK/JRE はまだ VM のアンロードをサポートしていません」とありました。それを呼び出さないでください。また、再初期化しないでください。

于 2013-08-28T11:29:35.387 に答える