O RXTX trabalha com drivers que dependem do sistema operacional que está em execução. Esses motoristas são fornecidos com a biblioteca RXTX e são:
librxtxSerial.so
elibrxtxParallel.so
para Linux.librxtxSerial.dll
elibrxtxParallel.dll
para Windows.librxtxSerial.jnilib
para Mac
Esse link tem as instruções para instalar corretamente estes drivers e esta pergunta: java.lang.unsatisfiedlinkerror: sem rxxxserial em java.library.path tem várias soluções alternativas para resolver esse tipo de exceção.
No entanto, todos eles assumem que você tem acesso a % java_home % caminho ou sabe onde os drivers estão localizados, o que é bom se você estiver trabalhando no seu computador, mas não tudo bem se precisar distribuir seu aplicativo. Se for esse o caso, basta copiar os arquivos do driver na mesma pasta em que seu jar
está localizado. Você tem que ver algo assim para saber que está funcionando corretamente:
Stable Library ========================================= Native lib Version = RXTX-2.1-7 Java lib Version = RXTX-2.1-7
Atualizar
Recentemente, notei que o Linux não inclui o diretório de trabalho atual em java.library.path
propriedade. Consequentemente se você simplesmente adicionar librxtxSerial.so
na pasta de aplicativos que você ainda obtém UnsatisfiedLinkError
. Mais uma vez, você pode definir esta propriedade quando executar o aplicativo através da linha de comando como esta:
java -jar -Djava.library.path=/path/to/lib
Ou você pode usar uma abordagem hacky explicada aqui: Definindo "java.library.path" programaticamente. Essa abordagem é insegura e eu não recomendo se você tiver acesso para implementar outra solução alternativa, mas eu tentei isso e funciona:
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();
}
}