【发布时间】:2017-10-25 12:43:21
【问题描述】:
我正在制作一个小程序来监听电视遥控器音量增大/减小的 IR 信号,然后重新广播到我的 A/V 系统,所以我不需要两个遥控器。
为此,我让 java 监听命令(并最终连接到 Internet 以接收命令),但我需要使用 C 来使用库来控制树莓派的 GPIO 足够快以生成 IR 信号。我已经让这两个程序独立工作,但是我在使用 JNI 从 Java 调用 C 程序时遇到了麻烦。
---没有背景,从这里开始---
当我正常运行我的java程序时,程序之间的连接很好,但是没有root权限就无法运行代码的C部分。
但是,当我以 root 身份运行它时,我得到了 Sender 库的“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 建立了符号链接,这就是为什么我的编译的 -I 部分也没有引用 linux 子目录。
我已将 LD_LIBRARY_PATH 导出为“/home/pi/Desktop/IRTranslator”,这是我所有代码等的位置。
感谢您阅读本文,它比我预期的要长!
【问题讨论】:
-
sudo 不会传递所有环境变量。您是否尝试过使用
sudo LD_LIBRARY_PATH=.... java -cp /opt/pi4j/lib/*:. Translator显式传递 LD_LIBRARY_PATH ? -
成功了!非常感谢,我不知道sudo是这样工作的,也不知道你可以这样设置环境变量!
-
太棒了 - 我已经添加了一个答案,因此可以将问题标记为已解决。
-
LD_LIBRARY_PATH正是sudo这样做的原因。否则你可以编译你自己的邪恶 libc,将变量指向它,现在一个用户因为调试原因只能运行一个无辜的、列入白名单的命令sudo dmesg可以运行他们想要的任何东西。 (显然,如果你有完全的 sudo 访问权限来运行任何东西,那么它的重要性就不会那么大了)
标签: java c linux java-native-interface raspbian