JNI Java 到 C - 在 运行 时正常查找库,但不是作为 root
JNI Java to C - finds library when run normally, but not as root
我正在制作一个小程序来监听我的电视遥控器音量 up/down 的 IR 信号,然后转播到我的 A/V 系统,所以我不需要两个遥控器。
为此,我 java 监听命令(并最终连接到互联网以接收命令),但我需要使用 C 来使用库来控制 raspberry pi的 GPIO 足够快以产生 IR 信号。我已经让这两个程序独立工作,但是我在使用 JNI 从 Java.
调用 C 程序时遇到了问题
---无背景从这里开始---
当我 运行 我的 java 程序正常时,程序之间的连接很好,但它不能 运行 代码的 C 部分而不是 root。
但是,当我 运行 它作为 root 时,我得到了 "java.lang.UnsatisfiedLinkError" 的发件人库。以下是我一直用于 compiling/linking 一切的命令:
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_PATH
sudo LD_LIBRARY_PATH=$LD_LIBRARY_PATH java -cp /opt/pi4j/lib/*:. Translator
我正在制作一个小程序来监听我的电视遥控器音量 up/down 的 IR 信号,然后转播到我的 A/V 系统,所以我不需要两个遥控器。
为此,我 java 监听命令(并最终连接到互联网以接收命令),但我需要使用 C 来使用库来控制 raspberry pi的 GPIO 足够快以产生 IR 信号。我已经让这两个程序独立工作,但是我在使用 JNI 从 Java.
调用 C 程序时遇到了问题---无背景从这里开始---
当我 运行 我的 java 程序正常时,程序之间的连接很好,但它不能 运行 代码的 C 部分而不是 root。
但是,当我 运行 它作为 root 时,我得到了 "java.lang.UnsatisfiedLinkError" 的发件人库。以下是我一直用于 compiling/linking 一切的命令:
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_PATH
sudo LD_LIBRARY_PATH=$LD_LIBRARY_PATH java -cp /opt/pi4j/lib/*:. Translator