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

时间:2014-07-29 09:09:09

标签: c++ jvm java-native-interface

我的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");
    
  4. 在这两种情况下,我在编译期间都没有错误,并且执行顺利,直到调用CallObjectMethod并且我们收到以下错误:

      

    Java Runtime Environment检测到致命错误:

         

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

         

    JRE版本:Java(TM)SE运行时环境(8.0_05-b13)(版本1.8.0_05-b13)    Java VM:Java HotSpot(TM)64位服务器VM(25.5-b02混合模式windows-amd64压缩oops)    有问题的框架:    j com.ibm.jc.terminal.RemoteJCTerminal.init(Ljava / lang / Object;)Lcom / ibm / jc / JCTerminal; +8

         

    无法编写核心转储。默认情况下,在Windows的客户端版本

    上未启用小型转储      

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

    哦,我认为值得注意的是JCTerminalClass和clss没有相同的值:分别为0x1dfec60和0x1dfec50 ......任何想法为什么会这样?因为我们正在谈论同一个班级......

    另外我认为obj很好地实例化我试图打印一些静态的最终值......

    感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

问题是"someString"参数。 init方法期望参数是Java对象 使用NewStringUTF JNI函数从jstring

构建char *