繁体   English   中英

仅在Windows中JNI EXCEPTION_ACCESS_VIOLATION(0xc0000005)msvcr100.dll + 0x1ed7

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM