我正在使用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
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();
}
void JNICALL Java_javaapplication7_thingy_hello (JNIEnv * env, jobject object){
printf("hi from C");
}
正常运行时,我希望代码将“ hi from C”打印到Netbeans的输出窗口中。
答案 0 :(得分:2)
7个半小时,我终于设法找到了解决方案。我遵循了van dench的建议,使用Visual Studios中的minGW编译器而不是Netbeans中的cygwin编译器来生成dll文件。
这是我发现的link to the video和paper,它们是如何执行此操作的。请注意,该视频是葡萄牙语。话虽如此,其后的文章是英文的,视频演示将逐步显示您需要执行的命令和配置。
如果其他人觉得有用,我愿意进一步详细说明我的解决方案。 祝好运!