La bibliothèque Java RXTX ne charge pas la bibliothèque native

fondamentalement, je voulais écrire un outil de communication simple pour mon Arduino en utilisant la bibliothèque RXTX pour java et a échoué horriblement quand il est venu à charger la Bibliothèque dynamique.

Mon spécifications du système:

OS: OS X Yosemite 10.10.3

Java: SDK 1.8.0_45

RXTX: 2.1 - 7r2-version modifiée pour le Mac intel tournant en java 64 bits, qui se trouve ici .

IDE: NetBeans 8

j'ai vérifié, que ces fichiers fonctionnent en suivant les instructions d'installation, qui consiste simplement à copier ces deux fichiers dans le répertoire /Library/Java/Extensions.

maintenant je voulais les enlever et charger la bibliothèque de mon application. J'ai fait ce qui suit:

  • ajouter la bibliothèque RXTXcomm au projet dans netbeans.
  • Y compris les conteneurs de la bibliothèque native dans le "java.bibliothèque.chemin " propriété utilisant le code suivant

System.setProperty("java.library.path", location.getPath() + File.pathSeparator + System.getProperty("java.library.path"));

  • et charger la bibliothèque en utilisant System.loadLibrary("rxtxSerial")

Lorsque j'ai compilé le code et essayé de l'exécuter, il m'a donné un

java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path

maintenant je me demande ce que j'ai fait de mal (peut-être un grand malentendu?)

Toute aide serait appréciée!

3
demandé sur redxef 2015-07-04 03:55:38

3 réponses

c'est une explication à votre problème et une suggestion à une solution.

RXTX a deux problèmes majeurs à mon avis:

  1. selon votre IDE, vous devez placer le Mac: RXTXcomm.jar et librxtxSerial.jnilib PC: RXTXcomm.jar , rxtxSerial.dll sur la racine du projet dans votre IDE ou code Java, il varie de IDE à IDE. La documentation ici ne couvre pas comment le faire dans des IDE différents comme NetBeans, IntelliJ même ainsi j'ai obtenu il fonctionne sur Eclipse et IntelliJ, mais pas encore NetBeans. J'ai encore d'autres questions.
  2. en fonction de votre système D'exploitation, même si vous lancez ce paquet, dans Windows 8.1 par exemple, il a des problèmes pour fermer le port. Et la seule solution est de redémarrer votre IDE / console et de vous reconnecter.

de quelque manière que ce soit, je vous suggère de passer à un paquet plus problématique, moins appelé JSSC

Voici une simple lecture des données du port série en utilisant JSSC:

public class Main {

    public static void main(String[] args) {
        SerialPort serialPort = new SerialPort("COM1");
        try {
            serialPort.openPort();//Open serial port
            serialPort.setParams(9600, 8, 1, 0);//Set params.
            byte[] buffer = serialPort.readBytes(10);//Read 10 bytes from serial port
            serialPort.closePort();//Close serial port
        }
        catch (SerialPortException ex) {
            System.out.println(ex);
        }
    }
}

Note: Ceci est une réponse ouverte, si l'un d'entre vous a de l'expérience à ce sujet, s'il vous plaît contribuer en éditant la réponse. J'ai vu des gens poser des questions et avoir presque le même problème avec RXTX I général.

1
répondu maytham-ɯɐɥʇʎɐɯ 2015-07-21 18:26:42

j'ai le même problème, mais croyez que je connais la cause.

j'avais auparavant RXTX fonctionnant sur OSX (Maverick) mais j'ai constaté que j'avais besoin de fonctionnalités uniquement disponibles dans le Java 8 JDK. J'ai installé cela sur le Java 6 JDK qui était sur la machine et une fois terminé était incapable d'exécuter n'importe quel code en utilisant la bibliothèque RXTX.

je crois que le problème est que les rejets JDK après 6 ne comprennent pas un environnement 32 bits qui est ce que RXTX requires.

si vous utilisez un JDK plus récent, je vous recommande d'installer le Java 6 JDK et de voir si cela résout votre problème. Lors de l'exécution de mes programmes compilés, je devrais inclure "-d32" pour spécifier d'utiliser l'environnement 32 bits. c'est à dire: "java -d32 test"

1
répondu AGuyNamedTom 2015-11-11 19:44:23

en plus de ma récente réponse celle-ci .

c'est le code pour supprimer le cache mentionné:

try {
    Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
    fieldSysPath.setAccessible(true);
    fieldSysPath.set(null, null);
} catch (NoSuchFieldException |
        SecurityException |
        IllegalArgumentException |
        IllegalAccessException ex) {
    ex.printStackTrace(System.err);
}

donc le problème n'était pas la bibliothèque RXTX mais plutôt ma propre incapacité à lire le doc java. Parce que je suis sûr que c'est mentionné quelque part au début.

0
répondu redxef 2017-05-23 12:25:08