RXTX funziona con i driver che dipendono dal sistema operativo che è in esecuzione. Questi driver sono dotati di libreria RXTX e sono:
librxtxSerial.so
elibrxtxParallel.so
per Linux.librxtxSerial.dll
elibrxtxParallel.dll
per finestre.librxtxSerial.jnilib
per Mac
Questo link Ha le istruzioni per installare correttamente questi driver e questa domanda: java.lang.unsatintifidedlinkerror: nessun rxtxserial in java.library.path Ha diverse soluzioni alternative per risolvere questo tipo di eccezione.
Tuttavia tutti presumono che tu abbia accesso a % Java_home % percorso o sai dove si trovano i driver, il che va bene se stai lavorando sul tuo computer ma non va bene se è necessario distribuire la tua app. In questo caso, basta copiare i file del driver nella stessa cartella in cui il tuo jar
è posto. Devi vedere qualcosa del genere per sapere che funziona correttamente:
Stable Library ========================================= Native lib Version = RXTX-2.1-7 Java lib Version = RXTX-2.1-7
Aggiornare
Di recente ho notato che Linux non include l'attuale directory di lavoro in java.library.path
proprietà. Di conseguenza, se si aggiunge semplicemente librxtxSerial.so
nella cartella app che ottieni ancora UnsatisfiedLinkError
. Ancora una volta, è possibile impostare questa proprietà quando si esegue l'applicazione tramite la riga di comando in questo modo:
java -jar -Djava.library.path=/path/to/lib
Oppure puoi usare un approccio hacky spiegato qui: Impostazione "java.library.path" a livello di programmazione. Questo approccio non è sicuro e non lo consiglio se hai accesso per implementare un'altra soluzione alternativa, ma l'ho provato e funziona:
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();
}
}