我正在製作一個小程序,用於偵聽電視機遙控器音量的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」,這是我所有代碼的位置,等等。
感謝您閱讀此內容,
sudo不會傳遞所有環境變量。您是否嘗試過使用'sudo LD_LIBRARY_PATH = .... java -cp/opt/pi4j/lib/*:顯式傳遞LD_LIBRARY_PATH。翻譯器? –
工作!非常感謝你,我不知道sudo是以這種方式工作的,或者你可以設置這樣的環境變量! –
太好了 - 我已經添加了一個答案,以便將問題標記爲已解決。 –