E:\Code\Java\JNITest>java test
Exception in thread "main" java.lang.UnsatisfiedLinkError: E:\Code\Java\JNITest\test.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at test.main(test.java:16)`
使用Java Native Interface时遇到了导致此错误的问题。我相信这是因为我用MinGW编译了.dll,编译成32位.dll而我的系统是64位,因此我的Java运行在64位。 反正是否迫使我的Java以32位运行?
答案 0 :(得分:26)
您必须安装32位JVM,然后才能运行代码。
如果要分发应用程序,则需要构建DLL的32位和64位版本。然后使用以下技术加载正确的DLL,无论您的客户是否拱门。将32或64(MyJniDLL32.dll和MyJniDLL64.dll)附加到生成的输出文件中。
String archDataModel = System.getProperty("sun.arch.data.model");
System.loadLibrary(libraryName+archDataModel);
答案 1 :(得分:8)
只是说明显而易见:要加载为32位架构构建的本机库,必须强制JVM以32位模式启动。
java -d32 ...
您可能需要为您的平台安装较旧的JVM(例如,OS X上的Oracle Java 7仅为64位,您需要从其知识库中获取Apple的Java 6)。
答案 2 :(得分:1)
在为Chrome浏览器安装Java插件后,我收到了相同的错误消息(没有stacktrace)。
重新安装JDK / JRE(这是一个开发环境)为我修复了它。
答案 3 :(得分:1)
在命令提示符
中运行以下cmdgcc -Wl, - add-stdcall-alias -I"%JAVA_HOME%\ include" -I"%JAVA_HOME%\包括\ WIN32" -shared -o test.dll test.c
答案 4 :(得分:-2)
DLL由本机操作系统运行。 Java只是将调用委托给DLL,它与编译它的操作系统非常紧密。一般来说,你不能以直接的方式和here is way来做。
答案 5 :(得分:-2)
IA是Itanium架构,因此AMD jvm正在尝试加载为Itanium构建的dll ...不要认为这样可行。