Java Native Interface 32 bit dll su sistema a 64 bit

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)` 

Durante l’utilizzo di Java Native Interface mi sono imbattuto in un problema che ha generato questo errore. Credo che questo sia dovuto al fatto che ho compilato il file .dll con MinGW che compila su una .dll a 32 bit mentre il mio sistema è a 64-bit e quindi il mio Java funziona a 64-bit. Esiste comunque la possibilità di forzare il mio Java a funzionare a 32-bit?

Dovrai installare una JVM a 32 bit e sarai in grado di eseguire il tuo codice.

Se hai intenzione di distribuire la tua applicazione, vorrai build entrambe le versioni a 32 bit e 64 bit della tua DLL. Quindi utilizzare la seguente tecnica per caricare la DLL corretta indipendentemente dall’archivio clienti. Aggiungere un 32 o un 64 (MyJniDLL32.dll e MyJniDLL64.dll) al file di output generato.

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

Giusto per affermare l’ovvio: per caricare una libreria nativa costruita per un’architettura a 32 bit, è necessario forzare la JVM per l’avvio in modalità a 32 bit.

 java -d32 ... 

Forse è necessario installare una JVM precedente per la propria piattaforma (ad esempio, Oracle 7 su OS X è solo a 64 bit, è necessario ottenere Java 6 di Apple dalla propria base di conoscenze).

Ho ricevuto lo stesso messaggio di errore (senza lo stacktrace) dopo aver installato il plug-in Java per il browser Chrome.

La reinstallazione di JDK / JRE (questo è un ambiente di sviluppo) lo ha risolto per me.

  1. Scarica mingw-w64 .
  2. Aggiorna il tuo PATH variabile d’ambiente.
  3. Crea un programma C di nome test.c che ha l’implementazione per il tuo metodo.
  4. Esegui il seguente cmd nel prompt dei comandi

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

Le DLL sono eseguite dal sistema operativo nativo. Java semplicemente delega la chiamata alla DLL che è strettamente legata al sistema operativo su cui è stata compilata. In generale non puoi farlo in modo diretto e qui è il modo .

Ma ci sono soluzioni alternative come WOW64 , che lo rende ansible. Si prega di consultare questi link ( 1 , 2 )

IA è un’architettura Itanium quindi un AMD jvm sta cercando di caricare una DLL che è stata costruita per Itanium … non pensate che funzionerà.

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