RXTX fonctionne avec des pilotes qui dépendent du système d'exploitation qu'il fonctionne. Ces pilotes sont fournis avec la bibliothèque RXTX et ils sont:
librxtxSerial.so
etlibrxtxParallel.so
pour Linux.librxtxSerial.dll
etlibrxtxParallel.dll
Pour les fenêtres.librxtxSerial.jnilib
pour Mac
Ce lien a les instructions pour installer correctement ces pilotes et cette question: java.lang.unsatisfiedlinkerror: pas de rxxxserial dans java.library.path a plusieurs solutions de contournement pour résoudre ce type d'exception.
Cependant, tous supposent que vous avez accès à% java_home% chemin ou que vous savez où se trouvent les pilotes, ce qui est bien si vous travaillez sur votre ordinateur, mais ce n'est pas OK si vous devez distribuer votre application. Si tel est le cas, copiez simplement les fichiers du pilote dans le même dossier où votre jar
est placé. Vous devez voir quelque chose comme ça pour savoir que cela fonctionne correctement:
Stable Library ========================================= Native lib Version = RXTX-2.1-7 Java lib Version = RXTX-2.1-7
Mise à jour
Récemment, j'ai remarqué que Linux n'inclut pas le répertoire de travail actuel dans java.library.path
propriété. Par conséquent si vous ajoutez simplement librxtxSerial.so
dans le dossier d'applications que vous obtenez toujours UnsatisfiedLinkError
. Encore une fois, vous pouvez définir cette propriété lorsque vous exécutez l'application via la ligne de commande comme ceci:
java -jar -Djava.library.path=/path/to/lib
Ou vous pouvez utiliser une approche hacky expliquée ici: Définition "java.library.path". Cette approche est dangereuse et je ne le recommande pas si vous avez accès à la mise en œuvre d'une autre solution de contournement, mais j'ai essayé cela et cela fonctionne:
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();
}
}