web-dev-qa-db-fra.com

Java Interface native dll 32 bits sur système 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)`

Lors de l'utilisation de Java Native Interface j'ai rencontré un problème qui a généré cette erreur. Je pense que c'est parce que j'ai compilé le .dll avec MinGW qui se compile en un .dll 32 bits alors que mon système est 64 -bit et donc mon Java s'exécute à 64 bits. Existe-t-il de toute façon de forcer mon Java à s'exécuter à 32 bits?)

28
Frank Vanbever

Vous devrez installer une machine virtuelle Java 32 bits et vous pourrez exécuter votre code.

Si vous prévoyez de distribuer votre application, vous souhaiterez créer des versions 32 bits et 64 bits de votre DLL. Utilisez ensuite la technique suivante pour avoir le bon DLL chargé quelle que soit l'archive de vos clients. Ajoutez un 32 ou un 64 (MyJniDLL32.dll & MyJniDLL64.dll) à votre fichier de sortie généré.

    String archDataModel = System.getProperty("Sun.Arch.data.model");
    System.loadLibrary(libraryName+archDataModel);
27
Java42

Juste pour dire l'évidence: pour charger une bibliothèque native conçue pour une architecture 32 bits, vous devez forcer la JVM à démarrer en mode 32 bits.

Java -d32 ...

Vous devez peut-être installer une ancienne machine virtuelle Java pour votre plate-forme (par exemple, Oracle Java 7 sur OS X est 64 bits uniquement, vous devez obtenir Apple Java 6 de leur base de connaissances).

8
fudge
  1. Télécharger mingw-w64.
  2. Mettez à jour votre variable d'environnement PATH.
  3. Créez un programme C nommé test.c qui a une implémentation pour votre méthode.
  4. Exécutez la cmd suivante dans l'invite de commande

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

1
arun kumar

J'ai reçu ce même message d'erreur (sans le stacktrace) après avoir installé le Java pour le navigateur Chrome Chrome).

La réinstallation de JDK/JRE (c'est un environnement de développement) l'a corrigé pour moi.

1
isapir