Android NDK open() 设备权限被拒绝

Android NDK open() device permission denied

在本机调用中,我尝试 open("/dev/video4", O_RDWR) 但我得到错误号 EACCES 13 "permission denied"。

如果我 运行 在同一个 Android 主机上的可执行文件中使用相同的代码*,作为我在上面 运行ning 安装的应用程序的相同 UID,它工作正常。 (* 细微差别如 main() 而不是 Java_com_test_testOpen()

我试过了chmod 666 /dev/video4,还是得到了EACCES,特别奇怪。

为什么相同的代码相同的主机上与相同的用户 , 在通过 JNI 调用时给出 EACCESS,在作为独立可执行文件调用时给出成功?

测试设备已植根并且 运行ning Cyanogenmod 12.1 (API 22),我的目标是 >= API 21 (5.0 Lollipop) 在植根设备上。感谢您的帮助。

由于在 运行 从 Android Java 应用程序中调用您的代码时出现错误,我猜您缺少权限。如果我没记错的话,这是你试图访问的相机,所以如果你添加:

 <uses-permission android:name="android.permission.CAMERA" />

你的 AndroidManifest.xml,你的申请应该 运行 没问题。

由于我使用其他小技巧构建 Cyanogenmod 12.1 (API 22),因此我能够通过使用以下技巧在我的应用程序中获得 /dev/video* 的权限:

  1. 对于标准 Linux 权限,android.permission.CAMERA 似乎不再允许访问 /dev/video*,即使它们归 system:camera 所有。相反,我编辑了 device/samsung/klte-common/rootdir/etc/ueventd.qcom.rc 并将 /dev/video* 行更改为 0666.
  2. 对于 SE Linux 权限,我将行 allow untrusted_app video_device:chr_file rw_file_perms; 添加到 external/sepolicy/untrusted_app.te

重建并安装映像后,我的 JNI 库可以访问 /dev/video*,我的客户很高兴!

答案对我来说还不够,所以我又留下了一个答案。 打开 API 有更多参数 'mode'.

int open(const char *pathname, int flags, mode_t mode);

查看 link http://man7.org/linux/man-pages/man2/open.2.html

您可能需要使用带有 S_IRWXU 选项的 'open'。 喜欢

open("/dev/video4", O_RDWR | O_CREAT, S_IRWXU )