在本机电话中,我正在尝试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)。谢谢你的帮助。
答案 0 :(得分:1)
由于从Android Java应用程序运行代码时出现错误,我猜您错过了权限。如果我没有弄错的话,那是你试图访问的相机,所以如果你添加:
<uses-permission android:name="android.permission.CAMERA" />
到你的AndroidManifest.xml,你的应用程序运行正常。
答案 1 :(得分:0)
由于我正在使用其他轻微的黑客攻击构建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;
添加到external/sepolicy/untrusted_app.te
。重建并安装图片后,我的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)