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

时间:2016-05-27 14:42:32

标签: android permissions android-ndk java-native-interface v4l2

在本机电话中,我正在尝试open("/dev/video4", O_RDWR),但我得到了错误的EACCES 13“权限被拒绝”。

如果我在同一个Android主机上的可执行文件中运行相同的代码*,就像我上面运行的已安装应用程序的UID一样,它运行正常。 (* main()代替Java_com_test_testOpen()

等细微差异

我已经尝试了chmod 666 /dev/video4并且仍然获得了EACCES,这特别奇怪。

为什么相同的主机上的相同的代码相同的用户一样,在通过JNI调用时提供EACCESS,并且当成功时被称为独立可执行文件?

测试设备已植根并运行Cyanogenmod 12.1(API 22),我在root设备上定位> = API 21(5.0 Lollipop)。谢谢你的帮助。

3 个答案:

答案 0 :(得分:1)

由于从Android Java应用程序运行代码时出现错误,我猜您错过了权限。如果我没有弄错的话,那是你试图访问的相机,所以如果你添加:

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

到你的AndroidManifest.xml,你的应用程序运行正常。

答案 1 :(得分:0)

由于我正在使用其他轻微的黑客攻击构建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
  3. 重建并安装图片后,我的JNI lib可以访问/dev/video*,我的客户很满意!

答案 2 :(得分:0)

答案对我来说还不够,所以我又留下了一个答案。 开放式API具有更多参数“模式”。

  

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

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

您可能需要对S_IRWXU选项使用'open'。 像

  

open(“ / dev / video4”,O_RDWR | O_CREAT,S_IRWXU)