我们有一段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方面完成的。
看起来像某种空指针问题,因为访问发生在接近0(0xc0000005)。由于它不是完全为null,因此在C代码中可能存在一些错误编码的指针算法。
经过大量调试后,通过将几个java内部类更改为static来解决问题。这些内部类是从C代码引用的。
public class MyClass{
// public class MyInnerClass{}
// was changed to
public static class MyInnerClass{}
}
显然,来自C的所有jni引用也被改变以反映这一点。仍然不确定为什么,但问题现在解决了。