当我试图用JNI代码注入DLL时,我现有的JVM (minecraft)崩溃了。当我尝试使用JNI函数时,我得到了这个错误。当我删除这个调用时,JVM没有崩溃。
崩溃代码(来自附加的Visual Studio调试器):
Unhandled exception at 0x00000000352B10CB in javaw.exe: 0xC0000005: Access violation reading location 0x0000000000000000.我的DLL代码:
#include "pch.h"
#include "jni.h"
#include <iostream>
JavaVM* jvm;
JNIEnv* env;
HANDLE jvmHandle;
FARPROC func_JNI_GetCreatedJavaVMs;
JavaVMInitArgs vm_args;
void init() {
AllocConsole();
freopen_s((FILE**)stdout, "CONOUT$", "w", stdout);
std::cout << "This works" << std::endl;
typedef jint(JNICALL* GetCreatedJavaVMs)(JavaVM**, jsize, jsize*);
GetCreatedJavaVMs jni_GetCreatedJavaVMs;
jni_GetCreatedJavaVMs = (GetCreatedJavaVMs)GetProcAddress(GetModuleHandle(
TEXT("jvm.dll")), "JNI_GetCreatedJavaVMs");
std::cout << "CreatedJavaVMs: "<<jni_GetCreatedJavaVMs << std::endl;
std::cout << "JVM load succeeded: Version ";
jint ver = env->GetVersion(); //Removing this removes crashes too.
std::cout << ((ver >> 16) & 0x0f) << "." << (ver & 0x0f) << std::endl;
//if (getEnvStat == JNI_EDETACHED)
//{
// vm->AttachCurrentThread((void**)&env, NULL);
// }
/*if (env != nullptr)
{
//start
}
if (env->ExceptionCheck())
{
env->ExceptionDescribe();
}
vm->DetachCurrentThread();*/
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
init();
return TRUE;
}发布于 2020-04-10 03:26:49
您不需要在任何地方初始化env。您获得了指向JNI_GetCreatedJavaVMs的指针,但永远不要调用它。从这到一个有效的JNIEnv有几个步骤...
https://stackoverflow.com/questions/61127438
复制相似问题