Interfaz nativa de Java dll de 32 bits en sistema de 64 bits


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 usar la interfaz nativa de Java me encontré con un problema que generó este error. Creo que esto es porque compilé el .dll con MinGW que compila a un 32-bit .dll mientras que mi sistema es de 64 bits y por lo tanto mi Java se ejecuta en 64 bits. ¿Hay alguna manera de forzar mi Java para funcionar a 32 bits?

Author: vaxquis, 2012-03-18

6 answers

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

Si va a distribuir su aplicación, querrá compilar versiones de 32 bits y 64 bits de su DLL. A continuación, utilice la siguiente técnica para tener el DLL adecuado cargado independientemente de su arco clientes. Añade un 32 o un 64 (MyJniDLL32.dll & MyJniDLL64.dll) a su archivo de salida generado.

    String archDataModel = System.getProperty("sun.arch.data.model");
    System.loadLibrary(libraryName+archDataModel);
 24
Author: Java42,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-18 10:46:55

Solo para indicar lo obvio: para cargar una biblioteca nativa construida para una arquitectura de 32 bits, debe forzar que la JVM se inicie en modo de 32 bits.

java -d32 ...

Posiblemente necesite instalar una JVM anterior para su plataforma (por ejemplo. Java 7 de Oracle en OS X es solo de 64 bits, necesita obtener Java 6 de Apple de su base de conocimientos).

 7
Author: fudge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-01 19:34:13

Recibí el mismo mensaje de error (sin stacktrace) después de instalar el plugin Java para el navegador Chrome.

Reinstalar JDK/JRE (este es un entorno de desarrollo) me lo arregló.

 1
Author: isapir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-30 17:11:23
  1. Descargar mingw-w64 .
  2. Actualice la ruta de la variable de entorno.
  3. Cree un programa en C llamado test.c que tiene implementación para su método.
  4. Ejecute el siguiente cmd en el símbolo del sistema

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

 1
Author: arun kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-27 17:29:35

Las DLL son ejecutadas por el sistema operativo nativo. Java simplemente delega la llamada a DLL que está muy estrechamente vinculada con el sistema operativo en el que se compiló. En general no se puede hacer de manera directa y aquí está el camino.

Pero hay soluciones alternativas como WOW64, lo que lo hace posible. Por favor, echa un vistazo a estos enlaces(1,2)

 -2
Author: Santosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:25

IA es arquitectura Itanium por lo que una jvm de AMD está tratando de cargar una dll que fue construida para Itanium...no creo que funcione.

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

 -2
Author: jjr8228,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-21 14:52:39