首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用JNI注入DLL使现有JVM崩溃

使用JNI注入DLL使现有JVM崩溃
EN

Stack Overflow用户
提问于 2020-04-10 02:04:56
回答 1查看 462关注 0票数 0

当我试图用JNI代码注入DLL时,我现有的JVM (minecraft)崩溃了。当我尝试使用JNI函数时,我得到了这个错误。当我删除这个调用时,JVM没有崩溃。

崩溃代码(来自附加的Visual Studio调试器):

代码语言:javascript
复制
Unhandled exception at 0x00000000352B10CB in javaw.exe: 0xC0000005: Access violation reading location 0x0000000000000000.

我的DLL代码:

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-10 03:26:49

您不需要在任何地方初始化env。您获得了指向JNI_GetCreatedJavaVMs的指针,但永远不要调用它。从这到一个有效的JNIEnv有几个步骤...

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61127438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档