RXTX работает с драйверами, которые зависят от ОС, которую она работает. Эти драйверы снабжены библиотекой RXTX, и они есть:
librxtxSerial.so
а такжеlibrxtxParallel.so
Для Linux.librxtxSerial.dll
а такжеlibrxtxParallel.dll
для окон.librxtxSerial.jnilib
для Mac
Эта ссылка Имеет инструкции по правильной установке этих драйверов и этот вопрос: java.lang.unsatisfiedlinkerror: нет rxtxserial в java.library.path имеет несколько обходных путей, чтобы решить этот вид исключения.
Однако все они предполагают, что у вас есть доступ к % java_home % path или вы знаете, где находятся драйверы, что в порядке, если вы работаете на своем компьютере, но это не нормально, если вам нужно распространять свое приложение. Если это так, просто скопируйте файлы драйверов в той же папке, где ваш jar
размещен. Вы должны увидеть что -то подобное, чтобы знать, что это работает правильно:
Stable Library ========================================= Native lib Version = RXTX-2.1-7 Java lib Version = RXTX-2.1-7
Обновлять
Недавно я заметил, что Linux не включает в себя текущий рабочий каталог в java.library.path
имущество. Следовательно, если вы просто добавите librxtxSerial.so
в папку приложений, которую вы все еще получаете UnsatisfiedLinkError
. Анкет Еще раз, вы можете установить это свойство, когда вы запустите приложение через командную строку, как это:
java -jar -Djava.library.path=/path/to/lib
Или вы можете использовать хакерский подход, объясненный здесь: Настройка «java.library.path» программно. Анкет Этот подход небезопасен, и я не рекомендую его, если у вас есть доступ для реализации другого обходного пути, но я попробовал это, и он работает:
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();
}
}