1

我在 Windows(64 位)上使用 GCC 标志 -c 和 -o Name.dll 编译了本机 DLL 文件。

当我执行 System.load("fullpahhere") 时,我收到此错误:

java.lang.UnsatisfiedLinkError: RenderControl.dll: %1 is not a valid Win32 application

如果我重新编译将空白 main() 方法添加到 C 源代码并删除 -c 标志,则它会失败并出现 UnsatisfiedLinkError ,表示它无法在 64 位机器上加载 32 位 DLL。

为什么Java调用没有main方法的DLL无效?这不会破坏 DLL 文件和 JNI 的全部意义吗?

更新

我修复了 main() 问题。此 GCC 调用设置有效:

gcc -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -I "C:\Program Files\Java\jdk1.6.0_32\include" -I "C:\Program Files\Java\jdk1.6.0_32\include\win32" -shared *.c -o lib.dll

但是,我仍然需要弄清楚 JVM 架构问题。

我在哪里可以找到能够编译 64 位代码的 MinGW 安装?看来我的标准 MinGW 安装只支持 32 位。

如果我能掌握它,我如何决定在 Java 中加载哪个库?是否有显示JVM 拱门(而不是操作系统拱门)的系统属性?

4

2 回答 2

1

如果使用 MinGW32 编译器,则无法生成 64 位代码。这很可能是故意的。我快速查找的其他人的类似问题似乎表明您正在尝试将 32 位本机二进制文件与 64 位 java 一起使用。

尝试使用mingw-w64进行编译,看看是否能解决问题。

还有一种可能是您的库根本不在库路径中,并且即使您提供System.load了完整路径也找不到它,在这种情况下,您应该确保您的 DLL 位于本机库的正确位置。

于 2012-12-08T22:29:07.873 回答
1

查看http://tdm-gcc.tdragon.net/,下载 TDM-GCC,它可以在 Windows 上轻松安装上面提到的 MinGW-w64。安装完 TDM-GCC 后,可以使用以下代码生成 64 位 dll。

"C:\MinGW64\bin\gcc.exe" -m64 -c -I"C:\Program Files\Java\jdk1.6.0_26\include" -I"C:\Program Files\Java\jdk1.6.0_26\include\win32" HelloWorld.c 

正是“-m64”使它成为64位。这是从与 HelloWorld.c C 代码源文件相同的目录运行的。这会在与 run.. 相同的目录中生成 HelloWorld.o C 代码对象文件。

于 2013-08-10T01:33:21.780 回答