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

问题描述 投票:0回答:2

我们有一段JNI代码,可以让我们链接到传统的C库。 Java应用程序引用C dll / so来调用c方法,这些方法创建一个带有Integers,Longs和Strings加载的新Java对象,然后将此对象传递回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

但它只发生在一些代码而不是其他代码......所以肯定是jni位是如何在C方面完成的。

java c java-native-interface access-violation
2个回答
0
投票

看起来像某种空指针问题,因为访问发生在接近0(0xc0000005)。由于它不是完全为null,因此在C代码中可能存在一些错误编码的指针算法。


0
投票

经过大量调试后,通过将几个java内部类更改为static来解决问题。这些内部类是从C代码引用的。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.