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.
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.
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.
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.
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 );
Hatte das gleiche Problem in win64bit und JVM 64bit
Wurde gelöst, indem DLL in System32 hochgeladen wurde
Gehe zu
Projekteigenschaften >> Ausführen >> VM - Optionen
und geben Sie diese Adresse ein:
-Djava.library.path="C:\opencv\build\Java\x64"
Stellen Sie sicher, dass Sie PATH auf Program Files (x86) not Program Files setzen. Das hat mein Problem gelöst.
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).
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.
Verwenden Sie als Speicherort für die native Bibliothek X64 über X86. Zumindest dieses Problem hatte ich behoben.
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.
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; ..
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.
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