加载c ++ dll文件时如何修复EXCEPTION_ACCESS_VIOLATION?

时间:2019-05-09 02:17:24

标签: c++ netbeans java-native-interface cygwin access-violation

问题

我正在使用Java本机接口(JNI)编写一个简单的Hello World程序。当我调用System.loadLibrary(“ libsimple_JNI”)加载包含C ++ hello world函数的dll文件时,会发生EXCEPTION_ACCESS_VIOLATION(0xc0000005)(我正在使用64位cygwin在Netbeans中进行编译)。

我尝试了静态加载库以及将其加载到调用C ++ hello world函数的Java helper函数中。我在系统环境变量中的cygwin1.dll中添加了路径,该路径解决了Java早期的问题,即无法找到我的dll文件的依赖项。

这是确切的错误消息

Java运行时环境检测到致命错误:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000180128dd7, pid=19116, tid=0x0000000000003ea8

 JRE version: Java(TM) SE Runtime Environment (8.0_131-b11) (build 1.8.0_131-b11)
 Java VM: Java HotSpot(TM) 64-Bit Server VM (25.131-b11 mixed mode windows-amd64 compressed oops)
 Problematic frame:
 C  [cygwin1.dll+0xe8dd7]

 Failed to write core dump. Minidumps are not enabled by default on client versions of Windows

 An error report file with more information is saved as:
 C:\Users\Kogondo Admin\Desktop\JavaApplication7\hs_err_pid19116.log

这是Java代码

public static void main(String[] args) {
        thingy my_thingy = new thingy();
        my_thingy.hi();
}
public class thingy {
    public thingy() {}

    public void hi(){
        System.loadLibrary("libsimple_JNI");
        hello();
    }

    private native void hello();
}

这是C ++代码

void JNICALL Java_javaapplication7_thingy_hello (JNIEnv * env, jobject object){

     printf("hi from C");

}

正常运行时,我希望代码将“ hi from C”打印到Netbeans的输出窗口中。

1 个答案:

答案 0 :(得分:2)

最终解决方案

7个半小时,我终于设法找到了解决方案。我遵循了van dench的建议,使用Visual Studios中的minGW编译器而不是Netbeans中的cygwin编译器来生成dll文件。

这是我发现的link to the videopaper,它们是如何执行此操作的。请注意,该视频是葡萄牙语。话虽如此,其后的文章是英文的,视频演示将逐步显示您需要执行的命令和配置。

如果其他人觉得有用,我愿意进一步详细说明我的解决方案。 祝好运!