it-swarm.com.de

IA 32-Bit-DLL kann nicht auf einer 64-Bit-AMD-Plattform geladen werden

Ich versuche, SVMLight von Java zu verwenden, und zwar mit dem JNI-Wrapper auf dieser Seite :

  static {
    System.loadLibrary("lib/JNI_SVM-light-6.01/lib/svmlight");
  }

Ich erhalte folgende Fehlermeldung:

... lib\JNI_SVM-light-6.01\lib\svmlight.dll: IA 32-Bit-DLL kann nicht geladen werden auf einer AMD 64-Bit-Plattform

Kann ich dieses Problem lösen, indem ich die .dll für 64 Bit neu kompiliere? Wie würde ich das machen? Gibt es eine andere Problemumgehung, die ich verwenden kann? SVMLight macht den C-Quellcode verfügbar.

46
Nick Heiner

Ja, Sie müssen die DLL für 64-Bit neu kompilieren. Die einzige andere Option ist, zu einer 32-Bit-JVM zu wechseln oder auf andere Weise einen 32-Bit-Prozess zu erhalten, um die DLL in Ihrem Namen zu laden und irgendwie mit diesem Prozess zu kommunizieren.

66
Daniel Pryden

Ich hatte das gleiche Problem mit einer Java-Anwendung, die die tibco-dll verwendet, die ursprünglich für Windows XP gedacht war. Damit es unter Windows 7 funktioniert, habe ich die Anwendung auf 32-Bit-JRE festgelegt. Warten, ob es eine andere Lösung gibt.

4
aditya

Kurze Antwort auf die erste Frage: Ja.

Längere Antwort: vielleicht; Es hängt davon ab, ob sich der Erstellungsprozess für SVMLight in 64-Bit-Fenstern verhält.

Schlussbemerkung: Der Aufruf von System.loadLibrary ist dumm. Rufen Sie entweder System.load mit einem vollständigen Pfadnamen auf oder lassen Sie es Java.library.path durchsuchen.

2
bmargulies

Hab das von - http://blog.cedarsoft.com/2010/11/setting-Java-library-path-programmatic/

Wenn Sie den Java.library.path festlegen, müssen die folgenden Zeilen vorhanden sein, um funktionieren zu können.

Field fieldSysPath;
fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" );
fieldSysPath.setAccessible( true );
fieldSysPath.set( null, null );
1
Vincent Tan

Hatte das gleiche Problem in win64bit und JVM 64bit

Wurde gelöst, indem DLL in System32 hochgeladen wurde 

1
Yaro

Gehe zu

Projekteigenschaften >> Ausführen >> VM - Optionen

und geben Sie diese Adresse ein:

-Djava.library.path="C:\opencv\build\Java\x64"
1
eng_hish

Stellen Sie sicher, dass Sie PATH auf Program Files (x86) not Program Files setzen. Das hat mein Problem gelöst.

1
Wojciechu

Machen Sie sich keine Sorgen, dass Sie einfach .dll von x64 in x86 in der systemeigenen Bibliothek ändern.

beispiel: - Sie haben dies möglicherweise ausgewählt (C:\opencv\build\Java\x64).

stattdessen wählen Sie dies für die native Bibliothek (C:\opencv\build\Java\x86).

0
Akash

Gehe einfach zur Installation von download jdk_x86 und es wird in Program Files (x86) installiert und der jre-Pfad in Ihrem Projekt festgelegt. Das ist es.

0
JoboFive

Verwenden Sie als Speicherort für die native Bibliothek X64 über X86. Zumindest dieses Problem hatte ich behoben.

0
이재찬

Mein Windows-Laptop hat sowohl die Clients 32 als auch 64 Bit, die ich plötzlich anging, und dann die Pfadvariable wie unten angeordnet 

Vor:

C:\app\Oracle64\product\12.1.0\client_1\bin;
C:\app\Oracle32\product\12.1.0\client_1\bin;

Nach dem:

C:\app\Oracle32\product\12.1.0\client_1\bin;
C:\app\Oracle64\product\12.1.0\client_1\bin;

angefangen zu arbeiten ... Hoffe, das hilft allen.

0

Ich hatte ein Problem beim Ausführen von red5 (Tomcat) unter Windows x64, das zuvor unter Windows x32 ausgeführt wurde. Nächste Fehlermeldung

 INFO pool-15-thread-1 com.home.launcher.CommandLauncher - Exception in thread "main" Java.lang.UnsatisfiedLinkError: C:\....\lib\Data Samolet.dll: Can't find dependent libraries
INFO pool-15-thread-1 com.home.launcher.CommandLauncher - at Java.lang.ClassLoader$NativeLibrary.load(Native Method)

Problem behoben, als ich Java x32 Version installierte und als Nächstes festlegte 

"Umgebungsvariablen"

"Benutzervariable für Home"

Java_HOME => C:\Programme (x86)\Java\jdk.1.6.0_45

"Systemvariablen"

Pfad [am Anfang] => C:\Programme\Java\jdk.1.8.0_60; ..

0
Denys Zotov

Ich hatte ein Problem damit und las 

"Exception in thread "main" Java.lang.UnsatisfiedLinkError: C:\opencv\build\Java\x86\opencv_Java2413.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform "and it took me an entire night to figure out.

Ich habe mein Problem gelöst, indem ich die DLL in C:\opencv\build\Java\x64 in meinen system32-Ordner kopiert habe. Ich hoffe, dass dies jemandem helfen wird.

0
Oti

Hier ist eine Antwort für diejenigen, die über die Befehlszeile/Eingabeaufforderung kompilieren. Es ist nicht erforderlich, die Umgebungsvariable Path zu ändern. Sie können einfach das 32-Bit-JVM für das Programm mit dem 32-Bit-DLL verwenden.

Für die Kompilierung sollte es egal sein, welches javac verwendet wird - 32-Bit oder 64-Bit.

>javac MyProgramWith32BitNativeLib.Java

Für die eigentliche Ausführung des Programms ist es is wichtig, den Pfad zur 32-Bit-Version von Java.exe Anzugeben.

Ich werde ein Codebeispiel für Windows posten, da dies das Betriebssystem zu sein scheint, das vom OP verwendet wird.

Windows

Der Code wird höchstwahrscheinlich etwa so lauten:

>"C:\Program Files (x86)\Java\jre#.#.#_###\bin\Java.exe" MyProgramWith32BitNativeLib 

Der Unterschied besteht in den Zahlen nach jre. Um herauszufinden, welche Nummern Sie verwenden sollten, geben Sie Folgendes ein:

>dir "C:\Program Files (x86)\Java\"

Auf meinem Computer ist der Prozess wie folgt

C:\Users\me\MyProject>dir "C:\Program Files (x86)\Java"
 Volume in drive C is Windows
 Volume Serial Number is 0000-9999

 Directory of C:\Program Files (x86)\Java

11/03/2016  09:07 PM    <DIR>          .
11/03/2016  09:07 PM    <DIR>          ..
11/03/2016  09:07 PM    <DIR>          jre1.8.0_111
               0 File(s)              0 bytes
               3 Dir(s)  107,641,901,056 bytes free

C:\Users\me\MyProject>

Also weiß ich, dass meine Zahlen 1.8.0_111 Sind und mein Befehl lautet

C:\Users\me\MyProject>"C:\Program Files (x86)\Java\jre1.8.0_111\bin\Java.exe" MyProgramWith32BitNativeLib
0
bballdave025