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

时间:2018-10-29 11:31:04

标签: java c java-native-interface access-violation

我们有一段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

我会尝试将其归咎于上帝模式的快捷方式-> Fatal error crashing on latest version of Java on Windows 10 machine

但是它只发生在一些代码上,而不是其他代码上……因此,在C端完成jni位肯定是一件事情。

2 个答案:

答案 0 :(得分:0)

由于访问发生在接近于0(0xc0000005)的位置,因此类似于某种空指针问题。由于不完全为null,因此您的C代码中可能存在一些编码错误的指针算法。

答案 1 :(得分:0)

经过大量调试后,通过将几个Java内部类更改为static解决了该问题。这些内部类已从C代码中引用。

public class MyClass{
   // public class MyInnerClass{}
   // was changed to 
   public static class MyInnerClass{}
}

显然,来自C的所有jni引用也都进行了更改以反映这一点。仍然不确定为什么,但是问题现在已经解决。