如何在Android应用程序中打开设备节点(/ dev / hidraw0)(通过C ++)?

时间:2016-12-28 04:18:50

标签: android c++ linux android-ndk selinux

我目前正在使用JNI / NDK将C ++通信库从Linux移植到Android。该设备是USB探测器,用于进行科学测量。它只是一个原始的HID,它出现为“/ dev / hidraw0”

我需要为设备获取文件描述符('_ fileHandle'),我正在通过以下方式进行:

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

其中'_devicePath'是设备节点“/ dev / hidraw0”。不幸的是,我遇到了Android(Permissions / SELinux,很可能)的问题,我在尝试执行open(...)命令后立即在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立即恢复它们)。

谢谢!

2 个答案:

答案 0 :(得分:1)

有一个API可以直接处理USB设备。看一下: https://developer.android.com/guide/topics/connectivity/usb/host.html

它能满足您的需求吗?

答案 1 :(得分:0)

@ y30是正确的。

在我的应用程序中使用root命令,我通过使用“setenforce 0”命令将SELinux设置为“Permissive”模式,然后我能够发送“chmod 666 / dev / hidraw0”命令和权限棒 - 我可以通过我的应用程序成功与设备通信。

有时候它仍然有点不稳定 - 我发现有时权限不会从我的应用程序设置,即使我在我的应用程序启动时运行命令后没有出现任何错误,我必须转到终端以root身份手动执行命令,然后返回我的应用程序。

感谢您的帮助!