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?
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);
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).
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ó.
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
- Descargar mingw-w64 .
- Actualice la ruta de la variable de entorno.
- Cree un programa en C llamado test.c que tiene implementación para su método.
-
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
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)
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.
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