加载c++ dll文件时如何修复EXCEPTION_ACCESS_VIOLATION?
How to fix EXCEPTION_ACCESS_VIOLATION when loading c++ dll file?
问题
我正在使用 Java 本机接口 (JNI) 编写一个简单的 Hello World 程序。当我调用 System.loadLibrary("libsimple_JNI") 加载包含 C++ hello world 函数的 dll 文件时,会出现 EXCEPTION_ACCESS_VIOLATION (0xc0000005)(我正在使用 64 位 cygwin 在 Netbeans 中编译)。
我试过静态加载库以及在调用 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:\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 中的输出 window。
最终解决方案
7个半小时我终于找到了解决办法。我听从了 van dench 的建议,使用 Visual Studios 中的 minGW 编译器而不是 Netbeans 中的 cygwin 编译器生成我的 dll 文件。
这是我找到的 link to the video and the paper,其中介绍了如何执行此操作。请注意,该视频是葡萄牙语的。话虽这么说,它后面的论文是英文的,视频演练逐步显示了您需要执行的命令和配置。
如果其他人觉得有用,我愿意进一步详细说明我的解决方案。
祝你好运!
问题
我正在使用 Java 本机接口 (JNI) 编写一个简单的 Hello World 程序。当我调用 System.loadLibrary("libsimple_JNI") 加载包含 C++ hello world 函数的 dll 文件时,会出现 EXCEPTION_ACCESS_VIOLATION (0xc0000005)(我正在使用 64 位 cygwin 在 Netbeans 中编译)。
我试过静态加载库以及在调用 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:\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 中的输出 window。
最终解决方案
7个半小时我终于找到了解决办法。我听从了 van dench 的建议,使用 Visual Studios 中的 minGW 编译器而不是 Netbeans 中的 cygwin 编译器生成我的 dll 文件。
这是我找到的 link to the video and the paper,其中介绍了如何执行此操作。请注意,该视频是葡萄牙语的。话虽这么说,它后面的论文是英文的,视频演练逐步显示了您需要执行的命令和配置。
如果其他人觉得有用,我愿意进一步详细说明我的解决方案。 祝你好运!