java.library.path

时间:2016-05-29 18:59:19

标签: java c maven java-native-interface raspberry-pi3

我尝试让这个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个文件。

我使用以下命令编译了二进制objekt:

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文件是特定于Raspberry Pi使用DHT11和DHT22传感器的常见C类,它在许多Raspberry Pi项目中使用,并且有很多来源,如this one

通过使用此C类(dhtreader.c)。 JNI / C,但由于上述错误,它无法正常工作。

我已经尝试在java main中使用以下方法设置java.library.path

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询问,但他们认为这是偏离主题的。

1 个答案:

答案 0 :(得分:2)

尝试简单地将dhtreader.so重命名为libdhtreader.so

实际上,当我们在java中调用System.loadLibrary("foo")时,库的预期名称是:

  • 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

注意:上面的命令假定你的lib位于lib目录中,该目录本身位于启动命令的目录中。