Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JNI Java to C-在正常运行时查找库,但不作为根目录运行_Java_C_Linux_Java Native Interface_Raspbian - Fatal编程技术网

JNI Java to C-在正常运行时查找库,但不作为根目录运行

JNI Java to C-在正常运行时查找库,但不作为根目录运行,java,c,linux,java-native-interface,raspbian,Java,C,Linux,Java Native Interface,Raspbian,我正在制作一个小节目,收听电视遥控器音量上下的红外信号,然后重播到我的a/V系统,所以我不需要两个遥控器 为了做到这一点,我让java监听命令(并最终连接到internet以接收命令),但我需要使用C来使用一个库来控制raspberry pi的GPIO,以足够快的速度生成IR信号。我已经让这两个程序独立工作,但是我在使用JNI从Java调用C程序时遇到了麻烦 ---无背景,从这里开始--- 当我正常运行java程序时,程序之间的连接很好,但如果不是root,它无法运行代码的C部分 但是,当我以r

我正在制作一个小节目,收听电视遥控器音量上下的红外信号,然后重播到我的a/V系统,所以我不需要两个遥控器

为了做到这一点,我让java监听命令(并最终连接到internet以接收命令),但我需要使用C来使用一个库来控制raspberry pi的GPIO,以足够快的速度生成IR信号。我已经让这两个程序独立工作,但是我在使用JNI从Java调用C程序时遇到了麻烦

---无背景,从这里开始---
当我正常运行java程序时,程序之间的连接很好,但如果不是root,它无法运行代码的C部分

但是,当我以root用户身份运行它时,会得到发送方库的“java.lang.unsatifiedlinkerror”。以下是我用来编译/链接所有内容的命令:

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创建了符号链接,这就是为什么我编译的-I部分也没有引用linux子目录的原因。
我已经将LD_LIBRARY_PATH导出为“/home/pi/Desktop/IRTranslator”,这是我所有代码的位置,等等


谢谢你阅读这篇文章,它比我想象的要长

sudo
不会将所有环境变量传递给它运行的命令(主要是出于安全原因)。因此,您需要显式地传递LD_LIBRARY_路径

sudo LD_LIBRARY_PATH=$LD_LIBRARY_PATH java -cp /opt/pi4j/lib/*:. Translator

sudo不会传递所有的环境变量。您是否尝试过使用
sudo LD\u LIBRARY\u PATH=..显式传递LD\u LIBRARY\u路径。。。。java-cp/opt/pi4j/lib/*:。翻译人员
?这很有效!非常感谢,我不知道sudo是这样工作的,或者你可以像那样设置环境变量!很好-我添加了一个答案,这样问题就可以标记为已解决。
LD\u LIBRARY\u PATH
正是
sudo
这样做的原因。否则,您可以编译自己的邪恶libc,将该变量指向它,现在,出于调试原因只能运行无辜的白名单命令的用户可以运行他们想要的任何东西。(显然,如果你有足够的sudo权限来运行任何东西,那就不那么重要了)