我的C ++ JNI代码,包括:
调用类的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 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很好地实例化我试图打印一些静态的最终值......
感谢您的帮助!
答案 0 :(得分:0)
问题是"someString"
参数。 init
方法期望参数是Java对象
使用NewStringUTF
JNI函数从jstring
char *