2017-05-25 48 views
2

我正在制作一个小程序,用于侦听电视机遥控器音量的IR信号,然后重播到我的A/V系统,所以我不需要两个遥控器。为了做到这一点,我有java听命令(并最终连接到互联网接收命令),但我需要使用C来使用库来控制覆盆子pi的GPIO足够快,以生成红外信号。我有这两个程序独立工作,但我有麻烦使用JNI从Java调用C程序。JNI Java to C - 在正常运行时查找库,但不能作为根

---对于没有背景,从这里开始---
当我运行我的Java程序正常,各项目之间的连接是由精细,但它不能没有被root身份运行代码的C-部分。

但是,当我以根用户身份运行它时,我得到了发件人库的“java.lang.UnsatisfiedLinkError”。这里是我一直在使用编译/连接一切的命令:

javac -cp /opt/pi4j/lib/*:/home/pi/Desktop/IRTranslator Translator.java 
javah Translator 
gcc -fPIC -Wall -pthread -o Sender -c Sender.c -lpigpio -lrt -I/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/include/ 
gcc Sender -shard -o libSender.so -lpigpio -lrt -Wl,-soname,Sender 
java -cp /opt/pi4j/lib/*:. Translator 

在我的Java代码,我有:

static { System.loadLibrary("Sender"); } 

同样,这一切不运行我的代码

工作正常
sudo java -cp /opt/pi4j/lib/*:. Translator 

其他(潜在的)的相关信息:
我为jni_md.h和jawt_md.h做符号链接,这就是为什么我的编译d的-I部分也不参考linux子目录。
我已经将LD_LIBRARY_PATH导出为“/ home/pi/Desktop/IRTranslator”,这是我所有代码的位置,等等。

感谢您阅读此内容,

+0

sudo不会传递所有环境变量。您是否尝试过使用'sudo LD_LIBRARY_PATH = .... java -cp/opt/pi4j/lib/*:显式传递LD_LIBRARY_PATH。翻译器? –

+0

工作!非常感谢你,我不知道sudo是以这种方式工作的,或者你可以设置这样的环境变量! –

+0

太好了 - 我已经添加了一个答案,以便将问题标记为已解决。 –

回答

0

sudo不会将所有环境变量传递给它运行的命令(主要是出于安全原因)。因此,您需要明确传递LD_LIBRARY_PATH

sudo LD_LIBRARY_PATH=$LD_LIBRARY_PATH java -cp /opt/pi4j/lib/*:. Translator 
相关问题