2016-05-27 2 views
2

В обычном вызове я пытаюсь использовать open("/dev/video4", O_RDWR), но я получаю errno EACCES 13 «permission denied».Android NDK open() разрешено разрешение на использование устройства

Если я запускаю тот же код * в исполняемом файле, на том же хосте Android, что и тот же UID установленного приложения, над которым я работаю выше, он работает нормально. (* незначительные отличия, такие как main() вместо Java_com_test_testOpen())

Я пробовал chmod 666 /dev/video4 и все еще получаю EACCES, что особенно странно.

Почему же код на же хосте, как же пользователя, дайте EACCESS при вызове через JNI, и успех при вызове в качестве автономного исполняемого файла?

Испытательное устройство внедрено и работает Cyanogenmod 12.1 (API 22), и я нацеливаюсь на> API 21 (5.0 Lollipop) на корневые устройства. Спасибо за вашу помощь.

+0

Это SELinux - dmesg имеет такие записи, как: 'avc: denied {read write} для pid = 2495 comm =" est.v4l2test "name =" video4 "dev =" tmpfs "ino = 15110 scontext = u: r: untrusted_app : s0 tcontext = u: object_r: video_device: s0 tclass = chr_file'. Я отправлю ответ, как только я его отсортирую. На данный момент 'echo 0>/sys/fs/selinux/enforce' делает трюк! – jkoreska

ответ

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.

После восстановления и установки изображения моя JNI lib имеет доступ к /dev/video*, и мой клиент счастлив!

1

Поскольку вы получаете сообщение об ошибке при запуске своего кода из приложения Java Java, я бы предположил, что вам не хватает разрешения. Это камера, что вы пытаетесь получить доступ, если я не ошибаюсь, так что если вы добавляете:

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

к вашему AndroidManifest.xml, ваше приложение должно работать нормально.

+0

Спасибо, но у меня есть это! Я понимаю, что это разрешение добавляет ваш UID приложения в камеру GID, но chmod 666 все равно переопределяет это. Кроме того, я обнаружил, что это было устранено в API 22+ по соображениям безопасности (в настоящее время не удается найти фиксацию или ссылку). – jkoreska