2012-03-18 140 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

相關問題