Нет dhtreader в java.library.path

Я пытаюсь заставить этот maven projekt работать на Raspberry Pi 3, но датчик DHT11 дает мне следующее ошибка:

sudo java -classpath '.:classes:*:classes:/opt/pi4j/lib/*' com.epam.llpd.greenhouse.web.ServerStarter

java.lang.UnsatisfiedLinkError: no dhtreader in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1864)
    at java.lang.Runtime.loadLibrary0(Runtime.java:870)
    at java.lang.System.loadLibrary(System.java:1122)
    at com.epam.llpd.greenhouse.sensor.Sensor.<clinit>(Sensor.java:16)
    at com.epam.llpd.greenhouse.PiHardwareController$1.run(PiHardwareController.java:132)

В папке \src\main\java\com\epam\llpd\greenhouse\sensor находится файл dhtreader.c.

Я скомпилировал бинарный объект с помощью следующей команды:

gcc -o dhtreader.so -lc -shared -I/usr/lib/jvm/jdk-7-oracle-arm-vfp-hflt/include -I/usr/lib/jvm/jdk-7-oracle-arm-vfp-hflt/include/linux dhtreader.c -l bcm2835

dhtreader.so находится в той же папке, что и .jar.

Файл dhtreader.c представляет собой общий класс C, специфичный для Raspberry Pi для использования датчиков DHT11 и DHT22, он используется во многих проектах Raspberry Pi и имеет множество источников, таких как вот этот.

Этот класс C (dhtreader.c) используется через. JNI/C, но он просто не работает из-за указанной выше ошибки.

Я уже пытался установить java.library.path с помощью следующего метода в основном java:

System.setProperty("java.library.path", "./");

Это не помогло. Вместо этого я добавил -Djava.library.path=./ в команду java:

sudo java -classpath '.:classes:*:classes:/opt/pi4j/lib/*' com.epam.llpd.greenhouse.web.ServerStarter -Djava.library.path=./

Но и это не помогло.

Теперь я застрял и не знаю, как добавить dhtreader.so к java.library.path.

Как добавить dhtreader.so к java.library.path?

Сначала я спросил в Raspberry Pi StackExchange, но они подумали, что это отключено. -тема.


person Spenhouet    schedule 29.05.2016    source источник


Ответы (1)


Попробуйте просто переименовать dhtreader.so в libdhtreader.so.

Действительно, когда мы вызываем System.loadLibrary("foo") в java, ожидаемое имя библиотеки:

  • Windows: foo.dll
  • Unix/Linux: libfoo.so
  • Mac: libfoo.jnilib

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

sudo java -Djava.library.path=./lib -classpath '.:classes:*:classes:/opt/pi4j/lib/*' com.epam.llpd.greenhouse.web.ServerStarter

NB: Приведенная выше команда предполагает, что ваша библиотека находится в каталоге lib, который сам находится в каталоге, в котором была запущена команда.

person Nicolas Filotto    schedule 29.05.2016
comment
Я взял существующий dhtreader.so, переименовал его и поместил в папку .jar. Это не сработало. В какие папки мне его поместить? Я так установил java.library.path для команды java? Или я что-то еще пропустил? - person Spenhouet; 29.05.2016
comment
Вы правы с первой проблемой (libdhtreader.so). Вторая проблема заключалась в том, чтобы написать -Djava.library.path сразу после sudo java, а не в конце основного класса. Теперь третья проблема заключалась в том, что libdhtreader.so не был скомпилирован с bcm2835, но это уже другая история. Спасибо за помощь! - person Spenhouet; 29.05.2016
comment
Да, я заметил. Вот почему я это понял ;) - person Spenhouet; 30.05.2016