2012-03-18 9 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)` 

Trong khi sử dụng Java Native Interface Tôi gặp sự cố tạo lỗi này. Tôi tin rằng điều này là bởi vì tôi biên soạn các .dll với MinGW mà biên dịch để một 32-bit .dll trong khi hệ thống của tôi là 64-bit và do đó Java của tôi chạy ở 64-bit. Có cách nào để buộc Java của tôi chạy ở 32 bit không?Giao diện Native Java 32 bit dll trên hệ thống 64 bit

+0

Bạn có thể cho biết phiên bản JRE/JDK và OS bạn đang sử dụng ngay bây giờ (32/64-bit; tôi nghi ngờ bạn đang sử dụng Windows)? Để biết thêm thông tin: https://forums.oracle.com/forums/thread.jspa?threadID=2271763 – ecle

+0

Liên kết trợ giúp bạn.http: //stackoverflow.com/questions/8374193/possible-to-force-a-64- bit-jvm-to-use-32-bit-mode-qua-the-argument-d32 –

+0

Tôi đang sử dụng windows 7 ultimate x86_64 và phiên bản x86 của jdk1.7.0_03 –

Trả lời

22

Bạn sẽ phải cài đặt một JVM 32 bit và bạn sẽ có thể chạy mã của mình.

Nếu bạn định phân phối ứng dụng của mình, bạn sẽ muốn xây dựng cả hai phiên bản 32 bit và 64 bit của DLL. Sau đó, sử dụng kỹ thuật sau đây để tải DLL phù hợp bất kể khách hàng của bạn là gì. Nối một hoặc 32 hoặc 64 (MyJniDLL32.dll & MyJniDLL64.dll) vào tệp đầu ra được tạo của bạn.

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

Điều đó có lẽ sẽ không giúp đỡ như JVM không chạy DLL. Hệ điều hành của nó thực hiện nó. JVM chỉ đơn giản là đại biểu các cuộc gọi đến DLL. – Santosh

+4

Tôi không đồng ý. Tôi xây dựng 32bit DLL và chạy một JVM 32bit và tất cả là tốt trên một hệ điều hành 64bit. Ngoài ra, dấu vết của ông cho thấy java.lang.System.loadLibrary để JVM đang tải dll. JNI DLL 32 vs 64 cần khớp với JVM 32 so với 64. – Java42

+0

OK. Cảm ơn. – Santosh

-2

Các DLL được chạy bởi hệ điều hành gốc. Java chỉ đơn giản là đại biểu các cuộc gọi đến DLL mà là rất chặt chẽ đan với hệ điều hành mà trên đó biên dịch của nó. Nói chung, bạn không thể làm điều đó theo cách thẳng thắn và here is way.

Nhưng có cách giải quyết khác như WOW64, điều này làm cho nó có thể. Vui lòng kiểm tra các liên kết này (1, 2)

-2

IA là kiến ​​trúc Itanium nên AMD jvm đang cố gắng tải một dll được xây dựng cho Itanium ... đừng nghĩ rằng nó sẽ hoạt động.

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

+2

Không. IA64 là Itanium, IA32 là x86. IA là viết tắt của 'Kiến trúc Intel', không nhất thiết là Itanium. –

1

tôi đã nhận rằng báo lỗi tương tự (không có stacktrace) sau khi cài đặt plugin Java cho trình duyệt Chrome.

Cài đặt lại JDK/JRE (đây là môi trường phát triển) đã sửa nó cho tôi.

6

Chỉ cần nêu rõ: để tải thư viện gốc được xây dựng cho kiến ​​trúc 32 bit, bạn phải buộc JVM bắt đầu ở chế độ 32 bit.

java -d32 ... 

Có thể bạn cần phải cài đặt một JVM cũ cho nền tảng của bạn (ví dụ. Oracle Java 7 trên OS X được 64bit chỉ, bạn cần phải nhận được của Apple Java 6 từ nền tảng kiến ​​thức của họ).

+1

'Lỗi: Phiên bản Java này không hỗ trợ JVM 32 bit.' – vaxquis

+1

[Câu hỏi thường gặp về Oracle] (http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#64bit_layering) đề xuất -d32/-d64 tùy chọn chỉ hữu ích trên Solaris; trên Windows/Linux, bạn cần phải cài đặt JVM 32 hoặc 64 bit thích hợp và chạy riêng JVM (ví dụ: bằng cách đưa nó vào đường dẫn hệ thống của bạn). –

1
  1. Tải xuống mingw-w64.
  2. Cập nhật biến môi trường PATH.
  3. Tạo chương trình C có tên test.c có triển khai cho phương pháp của bạn.
  4. Run sau cmd trong Command Prompt

    gcc -Wl, - add-stdcall-alias -I "% JAVA_HOME% \ include" -I "% JAVA_HOME% \ include \ win32" -shared -o test.dll test.c