Как программно загрузить librxtxSerial в Java - PullRequest
0 голосов
/ 17 февраля 2012

Я начал играть с Arduino, связывая его с Java, это было довольно просто, но теперь я хотел бы программно загрузить нативную библиотеку librxtxSerial, и я не могу понять.Поскольку я нахожусь на MacOS 64bit и использую Java6, я использовал следующий jnilib: http://blog.iharder.net/2009/08/18/rxtx-java-6-and-librxtxserial-jnilib-on-intel-mac-os-x/, как рекомендовано здесь: http://arduino.cc/playground/Interfacing/Java

После этого я попытался загрузить его программно следующим образом:

/**
  * Loads the jnilib
  */
public static void loadJniLib() {
    // loads the jnilib from the source folder "src/main/resources"
    URL url = Demo.class.getResource("/librxtxSerial.jnilib");
    try {
        System.load(url.getPath());
    }
    catch (UnsatisfiedLinkError unsatisfiedLinkError) {
        // native code library failed to load.
        unsatisfiedLinkError.printStackTrace();
    }
}

Что, кажется, работает (по крайней мере, не выдает исключение).

Но когда я вызываю CommPortIdentifier.getPortIdentifier(PORT_NAME);, оно выдает следующее исключение:

java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDriver
Exception in thread "main" java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1758)
    at java.lang.Runtime.loadLibrary0(Runtime.java:823)
    at java.lang.System.loadLibrary(System.java:1045)
    at gnu.io.CommPortIdentifier.<clinit>(CommPortIdentifier.java:83)
    at fr.free.mdwhatever.arduino.maven.Demo.initialize(Demo.java:57)
    at fr.free.mdwhatever.arduino.maven.Demo.main(Demo.java:102)

Так что яне понимаю, в чём дело, так как кажется, что это правильный способ загрузки в соответствии с: http://docs.oracle.com/javase/6/docs/api/java/lang/System.html#load(java.lang.String)

Есть идеи?

PS: Вы можете найти весь код здесь: https://gist.github.com/1853637, который работает при условии, что jxt rxtx находится в пути к классам и определено расположение собственной библиотеки (например, в Eclipse: http://www.eclipsezone.com/eclipse/forums/t49342.html)

1 Ответ

0 голосов
/ 17 февраля 2012

Самый простой способ работать с этим - установить системное свойство java.library.path, например, в командной строке, используя -Djava.library.path=/usr/lib/jni.

Насколько я помню, загрузка библиотеки может завершиться сбоем, если библиотека явно не внесена в белый список. Это, в свою очередь, означает, что библиотека должна быть на java.library.path.

...