2017-05-25 55 views
2

我正在製作一個小程序,用於偵聽電視機遙控器音量的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」,這是我所有代碼的位置,等等。

感謝您閱讀此內容,

+0

sudo不會傳遞所有環境變量。您是否嘗試過使用'sudo LD_LIBRARY_PATH = .... java -cp/opt/pi4j/lib/*:顯式傳遞LD_LIBRARY_PATH。翻譯器? –

+0

工作!非常感謝你,我不知道sudo是以這種方式工作的,或者你可以設置這樣的環境變量! –

+0

太好了 - 我已經添加了一個答案,以便將問題標記爲已解決。 –

回答

0

sudo不會將所有環境變量傳遞給它運行的命令(主要是出於安全原因)。因此,您需要明確傳遞LD_LIBRARY_PATH

sudo LD_LIBRARY_PATH=$LD_LIBRARY_PATH java -cp /opt/pi4j/lib/*:. Translator 
相關問題