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");
}