我在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)?
答案 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代码对象文件。