RXTX arbeitet mit Treibern zusammen, die vom Betriebssystem abhängen, das es ausgeführt hat. Diese Treiber sind mit der RXTX -Bibliothek versehen und sie sind:
librxtxSerial.so
undlibrxtxParallel.so
Für Linux.librxtxSerial.dll
undlibrxtxParallel.dll
für Windows.librxtxSerial.jnilib
Für Mac
Dieser Link hat die Anweisungen, diese Treiber ordnungsgemäß zu installieren, und diese Frage: java.lang.unsatisfiedlinkerror: kein rxtxserial in java.library.path Hat mehrere Problemumgehungen, um diese Art von Ausnahme zu lösen.
Alle von ihnen gehen jedoch davon aus, dass Sie Zugriff auf % Java_Home % Path haben oder wissen, wo sich die Treiber befinden, was in Ordnung ist, wenn Sie an Ihrem Computer arbeiten. Es ist jedoch nicht in Ordnung, wenn Sie Ihre App verteilen müssen. Wenn dies der Fall ist, kopieren Sie einfach die Treiberdateien in demselben Ordner, in dem Ihre jar
ist plaziert. Sie müssen so etwas sehen, um zu wissen, dass es richtig funktioniert:
Stable Library ========================================= Native lib Version = RXTX-2.1-7 Java lib Version = RXTX-2.1-7
Aktualisieren
Vor kurzem habe ich bemerkt, dass Linux das aktuelle Arbeitsverzeichnis nicht einbezieht java.library.path
Eigentum. Folglich, wenn Sie einfach hinzufügen librxtxSerial.so
In App -Ordner erhalten Sie immer noch UnsatisfiedLinkError
. Sie können diese Eigenschaft erneut festlegen, wenn Sie die Anwendung über die Befehlszeile wie folgt ausführen:
java -jar -Djava.library.path=/path/to/lib
Oder Sie können hier einen hackigen Ansatz verwenden: Setzen Sie "java.library.path" programmatisch. Dieser Ansatz ist unsicher und ich empfehle ihn nicht, wenn Sie Zugriff auf eine andere Problemumgehung haben, aber ich habe es versucht und es funktioniert:
String javaLibraryPath = System.getProperty("java.library.path");
if(!javaLibraryPath.contains(File.pathSeparator + "." + File.pathSeparator)){
StringBuilder sb = new StringBuilder(javaLibraryPath).append(File.pathSeparator).append(".");
// The line above appends "." (current directory) to the library path
// Of course 'rxtxSerial.so' must be placed in the current directory
System.setProperty("java.library.path", sb.toString());
try {
Field sysPathsField = ClassLoader.class.getDeclaredField("sys_paths");
sysPathsField.setAccessible(true);
sysPathsField.set(null, null);// Setting this field to null will force a reevaluation of
// the library path as soon as loadLibrary() is called
} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException ex) {
ex.printStackTrace();
}
}