2016-12-28 47 views
2

我目前正在使用JNI/NDK將一個C++通信庫從Linux移植到Android。該設備是用於進行科學測量的USB檢測器。這只是一個原始HID它出來作爲「的/ dev/hidraw0」如何在Android應用程序(通過C++)中打開設備節點(/ dev/hidraw0)?

我需要一個文件描述符(「_fileHandle」)到設備,這我通過做:

_fileHandle = open(_devicePath.c_str(), O_RDONLY | O_NONBLOCK); 

其中「 _devicePath'是設備節點「/ dev/hidraw0」。不幸的是,我運行到了Android(權限/ SELinux的,最有可能的)一個問題,我碰到下面的錯誤在我的logcat之後我嘗試執行打開(...)命令:

type=1400 audit(0.0:41): avc: denied { read } for name="hidraw0" dev="tmpfs" ino=229381 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:device:s0 tclass=chr_file permissive=0 

的「/ dev/hidraw0」的「ls -l」是:

crw------- 1 root root 229 

我該如何讓設備打開?

我試圖只是chmod節點上的權限和變化不堅持(Android立即恢復它們)。

謝謝!

+1

注1: 即使您成功通過chmod更改權限,SELinux也會阻止您。 注2: 如果你有「root」,你可以通過「setenforce 0」來禁用SELinux。 – y30

+0

類似的問題:http://stackoverflow.com/questions/37486349/android-ndk-open-device-permission-denied/37646688 – y30

回答

0

@ y30是正確的。

從我的應用程序中使用root命令,通過將「setenforce 0」命令設置爲「Permissive」模式,然後我能夠發送「chmod 666/dev/hidraw0」命令,權限保留 - 我可以通過我的應用程序成功地與設備通信。

雖然有時候它仍然有點不穩定 - 我發現有時權限不會從我的應用程序中設置,儘管在啓動我的應用程序後運行命令後我沒有收到任何錯誤,而且我有去終端手動執行命令作爲根,然後回到我的應用程序。

感謝您的幫助!

相關問題