Android NDK open()设备权限被拒绝
在一个本机调用中,我试图Android NDK open()设备权限被拒绝,android,permissions,android-ndk,java-native-interface,v4l2,Android,Permissions,Android Ndk,Java Native Interface,V4l2,在一个本机调用中,我试图打开(“/dev/video4”,O_RDWR),但我收到错误消息13“权限被拒绝” 如果我在同一台Android主机上的可执行文件中运行相同的代码*,与上面运行的已安装应用程序的UID相同,那么它工作正常。(*较小的差异,如main()而不是Java\u com\u test\u testOpen()) 我试过chmod666/dev/video4但仍然得到了答案,这特别奇怪 为什么在同一主机上,同一用户的同一代码在通过JNI调用时给出EACCESS,在作为独立可执行文
打开(“/dev/video4”,O_RDWR)
,但我收到错误消息13“权限被拒绝”
如果我在同一台Android主机上的可执行文件中运行相同的代码*,与上面运行的已安装应用程序的UID相同,那么它工作正常。(*较小的差异,如main()
而不是Java\u com\u test\u testOpen()
)
我试过chmod666/dev/video4
但仍然得到了答案,这特别奇怪
为什么在同一主机上,同一用户的同一代码在通过JNI调用时给出EACCESS,在作为独立可执行文件调用时给出success
测试设备是根化的,运行Cyanogenmod 12.1(API 22),我的目标是根化设备上>=API 21(5.0棒棒糖)。谢谢您的帮助。由于从Android Java应用程序运行代码时出错,我猜您缺少权限。如果我没有弄错的话,您正试图访问的是摄像头,因此如果您添加:
<uses-permission android:name="android.permission.CAMERA" />
对于您的AndroidManifest.xml,您的应用程序应该运行良好。由于我正在使用其他小技巧构建Cyanogenmod 12.1(API 22),我可以通过以下技巧获得应用程序中
/dev/video*
的权限:
android.permission.CAMERA
似乎不再允许访问/dev/video*
,即使它们属于system:CAMERA
。相反,我编辑了device/samsung/klte common/rootdir/etc/ueventd.qcom.rc
,并将/dev/video*
行更改为0666
allow untrusted_app video_device:chr_file rw_file_perms代码>至外部/隐私/不受信任的应用程序te
在重建和安装映像后,我的JNI库能够访问
/dev/video*
,我的客户很高兴 答案对我来说还不够,所以我又留了一个。
OpenAPI有更多参数“模式”
int open(常量字符*路径名、int标志、模式)
查看链接
您可能需要将“open”与S_IRWXU选项一起使用。
像
打开(“/dev/video4”,O|RDWR | O|CREAT,S|IRWXU)
谢谢,但我有这个!我的理解是,此权限会将您的应用程序UID添加到摄像头GID,但chmod 666无论如何都会覆盖此权限。另外,我发现出于安全原因(目前找不到提交或引用),这在API 22+中被删除了。它的SELinux-dmesg有如下条目:
avc:denied{read-write}for pid=2495 comm=“est.v4l2test”name=“video4”dev=“tmpfs”ino=15110 scontext=u:r:untrusted\u应用程序:s0 tcontext=u:object\u r:video\u设备:s0 tclass=chr\u文件
。我会在整理好后发布一个答案。现在,echo 0>/sys/fs/selinux/enforce
起作用了!