JNI:编译64位本机库时出现问题

时间:2012-12-08 22:18:50

标签: java c gcc java-native-interface native

我在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调用没有主方法的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 arch 的系统属性( NOT OS arch)?

2 个答案:

答案 0 :(得分:1)

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

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

还有可能你的库根本不在库路径中并且即使你给System.load完整路径它也找不到它,在这种情况下你应该确保你的DLL是在本地图书馆的正确位置。

答案 1 :(得分:1)

查看http://tdm-gcc.tdragon.net/,下载TDM-GCC,在Windows上为上面提到的MinGW-w64轻松安装。您可以使用以下代码在installint 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代码对象文件。