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*
的权限:
- 对于标准 Linux 权限,
android.permission.CAMERA
似乎不再允许访问 /dev/video*
,即使它们归 system:camera
所有。相反,我编辑了 device/samsung/klte-common/rootdir/etc/ueventd.qcom.rc
并将 /dev/video*
行更改为 0666
.
- 对于 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 )
在本机调用中,我尝试 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*
的权限:
- 对于标准 Linux 权限,
android.permission.CAMERA
似乎不再允许访问/dev/video*
,即使它们归system:camera
所有。相反,我编辑了device/samsung/klte-common/rootdir/etc/ueventd.qcom.rc
并将/dev/video*
行更改为0666
. - 对于 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 )