![](/img/trans.png)
[英]EXCEPTION_ACCESS_VIOLATION (0xc0000005) JVM from JNI?
[英]JNI EXCEPTION_ACCESS_VIOLATION (0xc0000005) msvcr100.dll+0x1ed7 in Windows only
我们有一段JNI代码,可让我们链接到旧版C库。 Java应用程序引用C dll / so来调用c方法,该方法将创建一个新的Java对象,并加载整数,Long和String,然后将该对象传递回Java代码。 Java代码尝试打印从C返回的这些值,并在代码中的不同点随机崩溃。 当我们在Linux上运行它时,它没有问题,但是在Windows中,它间歇性地崩溃,并显示:
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x77e11ed7, pid=893220,
tid=887676
#
# JRE version: Java(TM) SE Runtime Environment (8.0_05-b13) (build 1.8.0_05- b13)
# Java VM: Java HotSpot(TM) Client VM (25.5-b02 mixed mode, sharing windows-x86 )
# Problematic frame:
# C [msvcr100.dll+0x1ed7]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
我会尝试将其归咎于上帝模式快捷方式-> Windows 10计算机上最新版本的Java发生致命错误
但这只发生在某些代码而不是其他代码上……因此,在C端完成jni的代码肯定是一件事情。
由于访问发生在接近0(0xc0000005)的位置,因此看起来像某种空指针问题。 由于它不完全为null,因此C代码中可能存在一些编码错误的指针算法。
经过大量调试后,通过将几个Java内部类更改为static解决了该问题。 这些内部类已从C代码中引用。
public class MyClass{
// public class MyInnerClass{}
// was changed to
public static class MyInnerClass{}
}
显然,来自C的所有jni引用也都进行了更改以反映这一点。 仍然不确定为什么,但是问题现在已经解决。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.