【问题标题】:How to open device node (/dev/hidraw0) in Android app (via C++)?如何在 Android 应用程序中(通过 C++)打开设备节点(/dev/hidraw0)?
【发布时间】:2016-12-28 04:18:50
【问题描述】:

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

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

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

其中“_devicePath”是设备节点“/dev/hidraw0”。不幸的是,我遇到了 Android 问题(很可能是权限/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 会立即恢复它们)。

谢谢!

【问题讨论】:

  • 注1:即使您成功地使用chmod 更改了权限,SELinux 也会阻止您。注意 2:如果您有“root”,则可以使用“setenforce 0”禁用 SELinux。

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


【解决方案1】:

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

它满足你的需要吗?

【讨论】:

    【解决方案2】:

    @y30 是正确的。

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

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

    感谢您的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 2020-06-11
      • 2019-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多