JRE检测到致命错误- EXCEPTION_ACCESS_VIOLATION (0xc0000005)

fatal error detected by the JRE - EXCEPTION_ACCESS_VIOLATION (0xc0000005)

本文关键字:ACCESS VIOLATION 0xc0000005 EXCEPTION 检测 致命错误 JRE      更新时间:2023-10-16

我的c++ JNI代码,包括:

  1. 查找要使用的java类
  2. 调用构造函数
  3. 调用类的init函数:我尝试使用FindClass函数(JCTerminalClass)返回的jclass和GetObjectClass(obj)返回的jclass。

    1. JCTerminalClass = env->FindClass("com/ibm/jc/terminal/RemoteJCTerminal");
    2. mid = env->GetMethodID(JCTerminalClass, "<init>", "()V");
    if(mid !=0) {        
        obj = env->NewObject(JCTerminalClass, mid);
        cout << "Object created with constructor" << endl;
    }
    3.jclass clss = env->GetObjectClass(obj);  
    mid = env->GetMethodID(JCTerminalClass,"init","(Ljava/lang/Object;)Lcom/ibm/jc/JCTerminal;");
    /*  or   */ 
    mid = env->GetMethodID(clss,"init","(Ljava/lang/Object;)Lcom/ibm/jc/JCTerminal;");
    obj = (jobject)env->CallObjectMethod(obj, mid, "someString");
    

在这两种情况下,我在编译期间没有得到错误,并且执行顺利,直到调用CallObjectMethod,我们得到以下错误:

Java运行时环境检测到致命错误:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000000028120b6, pid=4064, tid=1576

JRE版本:Java(TM) SE Runtime Environment (8.0_05-b13) (build 1.8.0_05-b13)Java虚拟机:Java HotSpot(TM) 64位Server虚拟机(25.5-b02混合模式windows-amd64压缩ops)有问题的框架:j com.ibm.jc.terminal.RemoteJCTerminal.init (Ljava/lang/对象;)Lcom/ibm/jc/JCTerminal; + 8

写核心转储失败。默认情况下,Windows客户端版本不启用迷你转储

包含更多信息的错误报告文件保存为:

哦,我认为值得注意的是,JCTerminalClass和class没有相同的值:分别为0x1dfec60和0x1dfec50…知道这是为什么吗?既然我们讨论的是同一个类……

加上我认为对象是很好的实例化,我尝试打印一些静态的最终值…

谢谢你的帮助!

问题是"someString"参数。init方法期望参数是一个Java对象。
NewStringUTF JNI函数从char *构造jstring