2016-12-28 3 views
2

Je suis actuellement le portage d'une bibliothèque de communication C++ de Linux vers Android avec JNI/NDK. L'appareil est un détecteur USB pour effectuer des mesures scientifiques. Il est juste un HID brut qui vient comme «/dev/hidraw0 »Comment ouvrir le nœud de périphérique (/ dev/hidraw0) dans l'application Android (via C++)?

je dois obtenir un descripteur de fichier (« _fileHandle ») au dispositif, ce que je fais via:

_fileHandle = open(_devicePath.c_str(), O_RDONLY | O_NONBLOCK); 

où ' _devicePath 'est le noeud de périphérique "/ dev/hidraw0". Malheureusement, je suis en cours d'exécution dans un problème avec Android (Permissions/SELinux, le plus probable) et je reçois l'erreur suivante dans mon logcat juste après que je tente d'exécuter la commande d'ouverture (...):

type=1400 audit(0.0:41): avc: denied { read } for name="hidraw0" dev="tmpfs" ino=229381 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:device:s0 tclass=chr_file permissive=0 

Le "ls -l" de "/ dev/hidraw0" est:

crw------- 1 root root 229 

Comment puis-je ouvrir l'appareil?

J'ai essayé de juste chmod les permissions sur le noeud et les changements ne collent pas (Android les renverse immédiatement).

Merci!

+1

NOTE1: Même si vous réussissez à modifier les autorisations avec chmod, le SELinux vous bloquait. NOTE2: Si vous avez "root" vous pouvez désactiver le SELinux avec "setenforce 0". – y30

+0

Une question similaire: http://stackoverflow.com/questions/37486349/android-ndk-open-device-permission-denied/37646688 – y30

Répondre

0

@ y30 était correct. En utilisant les commandes root de mon application, je l'ai fait fonctionner en mettant SELinux en mode "Permissive" avec la commande "setenforce 0", et ensuite je peux envoyer la commande "chmod 666/dev/hidraw0" et les autorisations coller - je suis alors en mesure de communiquer avec succès avec l'appareil de mon application. Il est parfois un peu instable à certains moments, je trouve parfois que les autorisations ne sont pas définies à partir de mon application, même si je ne reçois aucune erreur après avoir exécuté les commandes au démarrage de mon application, et j'ai aller à un terminal pour exécuter manuellement les commandes en tant que root, puis revenir à mon application.

Merci pour l'aide!