2012-03-18 176 views
22
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本机接口时遇到了一个产生此错误的问题。我相信这是因为我使用MinGW编译.dll,编译为32位.dll,而我的系统是64位,因此我的Java以64位运行。 有没有办法强制我的Java运行在32位?64位系统上的Java本地接口32位dll

+0

你能告诉你正在使用的JRE/JDK和OS版本(32/64位,我怀疑你使用的是Windows)吗?欲了解更多信息:https://forums.oracle.com/forums/thread.jspa?threadID=2271763 – ecle 2012-03-18 10:12:02

+0

链接帮助您.http://stackoverflow.com/questions/8374193/possible-to-force-a-64- bit-jvm-to-use-32-bit-mode-via-the-argument-d32 – 2012-03-18 10:13:41

+0

我使用的是Windows 7终极x86_64和x86版本的jdk1.7。0_03 – 2012-03-18 10:39:50

回答

22

您必须安装32位JVM,才能运行代码。

如果您打算分发您的应用程序,则需要构建DLL的32位和64位版本。然后使用以下技术来加载正确的DLL,而不管您的客户是否有足够的权限。将32或64(MyJniDLL32.dll & MyJniDLL64.dll)附加到生成的输出文件中。

String archDataModel = System.getProperty("sun.arch.data.model"); 
    System.loadLibrary(libraryName+archDataModel); 
+0

由于JVM不运行DLL,这可能不会有帮助。它是它的操作系统。 JVM只是将调用委托给DLL。 – Santosh 2012-03-18 10:23:03

+4

我不同意。我构建32位DLL并运行32位JVM,在64位操作系统上都可以。另外,他的跟踪显示java.lang.System.loadLibrary,因此JVM正在加载dll。 JNI DLL 32 vs 64需要与JVM 32 vs 64匹配。 – Java42 2012-03-18 10:34:06

+0

明白了。谢谢。 – Santosh 2012-03-18 10:51:32

-2

DLL由本地操作系统运行。 Java只是将调用委托给与编译的操作系统非常紧密结合的DLL。一般来说,你不能以直接的方式完成它,并且here is way

但有一些解决方法,如WOW64,这使得它成为可能。请查看这些链接(1,2

-2

IA是Itanium体系结构,因此AMD jvm正试图加载为Itanium构建的dll ...不要认为这会起作用。

http://en.wikipedia.org/wiki/Itanium

+2

编号IA64是Itanium,IA32是x86。 IA代表'英特尔架构',它不一定是安腾。 – 2012-09-21 22:31:45

1

我得到了安装Java插件Chrome浏览器后,同样的错误信息(不包括堆栈跟踪)。

重新安装JDK/JRE(这是一个开发环境)为我解决了它。

6

只是为了陈述显而易见的事情:要加载为32位体系结构构建的本机库,必须强制JVM以32位模式启动。

java -d32 ... 

可能你需要安装一个老版本的JVM的平台(如Oracle的Java 7 OS X仅64位,你需要从他们的知识基础得到苹果的Java 6)。

+1

'错误:此Java实例不支持一个32位的JVM.' – vaxquis 2016-04-01 19:34:53

+1

[本甲骨文FAQ](http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#64bit_layering)建议-d32/-d64选项仅在Solaris上有用;在Windows/Linux上,您需要安装合适的32位或64位JVM,并专门运行您想要的(例如,将其包含在系统路径中)。 – 2017-01-10 09:04:21

1
  1. 下载mingw-w64
  2. 更新您的环境变量PATH。
  3. 创建一个名为的C程序test.c它有你的方法的实现。
  4. 运行以下cmd在命令提示

    GCC轮候册, - 附加STDCALL别名-I “%JAVA_HOME%\包括” -I “%JAVA_HOME%\包括\ win32的” -shared -o test.dll test.c

相关问题