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

Al utilizar Java Native Interface me encontré con un problema que generó este error. Creo que esto se debe a que compilé el .dll con MinGW, que se compila en un .dll de 32 bits, mientras que mi sistema es de 64 bits y, por lo tanto, mi Java se ejecuta en 64 bits. ¿Hay alguna forma de obligar a mi Java a ejecutarse a 32 bits?Java Native Interface dll de 32 bits en el sistema de 64 bits

+0

¿Puede decirnos la versión JRE/JDK y OS que está utilizando ahora (32/64 bits, sospecho que está usando Windows)? Para obtener más información: https://forums.oracle.com/forums/thread.jspa?threadID=2271763 – ecle

+0

Link help you.http: //stackoverflow.com/questions/8374193/possible-to-force-a-64- bit-jvm-to-use-32-bit-mode-via-the-argument-d32 –

+0

estoy usando Windows 7 ultimate x86_64 y la versión x86 de jdk1.7.0_03 –

Respuesta

22

Tendrá que instalar una JVM de 32 bits y podrá ejecutar su código.

Si va a distribuir su aplicación, querrá compilar las versiones de 32 bits y de 64 bits de su DLL. A continuación, utilice la siguiente técnica para cargar la DLL correcta independientemente del arco de sus clientes. Agregue 32 o 64 (MyJniDLL32.dll & MyJniDLL64.dll) a su archivo de salida generado.

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

. Probablemente no sirva de ayuda ya que el JVM no ejecuta el DLL. Es el sistema operativo que lo hace. JVM simplemente delega la llamada a DLL. – Santosh

+4

No estoy de acuerdo. Construyo archivos DLL de 32 bits y ejecuto una JVM de 32 bits y todo está bien en un sistema operativo de 64 bits. Además, su traza muestra java.lang.System.loadLibrary por lo que la JVM está cargando el dll. El JNI DLL 32 vs 64 debe coincidir con el JVM 32 vs 64. – Java42

+0

Lo tengo. Gracias. – Santosh

-2

Las DLL las ejecuta el sistema operativo nativo. Java simplemente delega la llamada a DLL, que está muy relacionada con el sistema operativo en el que se compila. En general, no puede hacerlo de manera directa y here is way.

Pero hay soluciones como WOW64, que lo hace posible. Consulte estos enlaces (1, 2)

-2

IA es una arquitectura Itanium por lo que AMD jvm está tratando de cargar un dll que se creó para Itanium ... no creo que funcione.

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

+2

No. IA64 es Itanium, IA32 es x86. IA significa 'Arquitectura Intel', que no es necesariamente Itanium. –

1

que tiene ese mismo mensaje de error (sin el StackTrace) después de instalar el plugin de Java para el navegador Chrome.

Reinstalando JDK/JRE (este es un entorno de desarrollo) lo arregló para mí.

6

Solo para indicar lo obvio: para cargar una biblioteca nativa construida para una arquitectura de 32 bits, debe forzar a la JVM a iniciarse en el modo de 32 bits.

java -d32 ... 

Posiblemente es necesario instalar una JVM mayores para su plataforma (por ejemplo. De Oracle Java 7 en OS X es de 64 bits única, que necesita para obtener de Apple Java 6 de su base de conocimientos).

+1

'Error: esta instancia de Java no admite una JVM de 32 bits. – vaxquis

+1

[Esta pregunta frecuente de Oracle] (http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#64bit_layering) sugiere el -d32/-d64 opción solo es útil en Solaris; en Windows/Linux debe instalar la JVM adecuada de 32 o 64 bits y ejecutar específicamente la que desee (por ejemplo, incluyéndola en la ruta de su sistema). –

1
  1. Descargar mingw-w64.
  2. Actualice su variable de entorno PATH.
  3. Cree un programa en C llamado test.c que tiene implementación para su método.
  4. Ejecutar el siguiente cmd en Símbolo del sistema de

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

Cuestiones relacionadas