加载C DLL文件时,如何修复异常_access_violation

How to fix EXCEPTION_ACCESS_VIOLATION when loading c++ dll file?

本文关键字:异常 何修复 access violation DLL 文件 加载      更新时间:2023-10-16

问题

我正在使用Java本机接口(JNI(编写一个简单的Hello World程序。当我调用system.loadlibrary(" libsimple_jni"(以加载包含C Hello World函数的DLL文件时,发生了一个异常_ACCESS_VIOLATION(0xc0000005((我正在用64位Cygwin在NetBean中编译NetBean。

我尝试过静态加载库,并将其加载到称为C Hello World函数的Java辅助功能中。我在系统环境变量中添加了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:UsersKogondo AdminDesktopJavaApplication7hs_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");
}

正确运行时,我希望代码可以打印"从C"打印到Netbeans的输出窗口。

最终解决方案

7半小时,我终于设法找到了解决方案。我遵循Van Dench的建议,使用Visual Studios中的MINGW编译器而不是Netbeans中的Cygwin编译器生成我的DLL文件。

这是我发现的视频和纸张的链接,这些链接遍历了如何做到这一点。请注意,该视频位于葡萄牙。话虽如此,它遵循的论文是英文,视频演练逐步显示您需要做的命令和配置。

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