有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JNIJava到C在正常运行时查找库,但不作为根目录运行

我正在制作一个小节目,收听电视遥控器音量上下的红外信号,然后重播到我的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”,这是我所有代码的位置,等等

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


共 (1) 个答案

  1. # 1 楼答案

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

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