2014-09-04 2 views
6

J'essaie d'utiliser libusb sur le Nexus 5 non rooté comme indiqué dans this approach (en transférant le descripteur de fichier usb de java vers le côté natif).Android L | libusb_init renvoie LIBUSB_ERROR_OTHER (-99)

Mon application demande l'autorisation via UsbManager.requestPermission, puis exécute la méthode native qui appelle libusb_init pour créer libusb_context.

Mais libusb_init renvoie le code LIBUSB_ERROR_OTHER (-99). Après avoir creusé le code, je vois pourquoi cela arrive. libusb signale 'could not find usbfs' car opendir("/dev/bus/usb") renvoie 0.

également de adb shell Je ne peux pas effectuer ls /dev, étrange parce que j'ai des droits (sur Huawei U8950-1 avec les mêmes droits que je peux le faire):

drwxr-xr-x root root 2014-09-04 10:26 dev

Ressemble approche décrite ci-dessous travail pas pour tous les appareils Android. Quelqu'un peut-il expliquer pourquoi?

Répondre

3

Il existe déjà une solution dans cette fourchette libusb:

https://github.com/martinmarinov/rtl_tcp_andro-

Maintenant, non seulement vous devrez passer le descripteur de fichier, vous devrez passer le chemin du fichier de périphérique et via UsbDevice.getDeviceName().

+0

Merci pour la réponse, mais j'ai préféré https: // github.com/Gritzman/libusb parce que les solutions de Gritzman ont été implémentées sans modifier 'libusb.h' – CAMOBAP

+0

@CAMOBAP J'essaie d'utiliser la version de libusb de Gritzman. Comment puis-je passer dans le descripteur de fichier? Comment puis-je obtenir un libusb_device pour le premier paramètre de libusb_open()? Merci. –

+0

@AntaoAlmada regardez https://github.com/Gritzman/libusb/blob/master/jni/usb/os/linux_usbfs.c (commentaires avec Android). Il n'y a pas besoin de modifier l'interface et de passer le fichier descriptior – CAMOBAP

2

On dirait Android L avoir une restriction supplémentaire sur l'accès à /dev deirectory. Je n'ai pas plus d'idées sur ce

Mise à jour

Security Enhancements in Android 5.0

...

bac à sable Android renforcé avec SELinux. Android nécessite maintenant SELinux en mode de mise en vigueur pour tous les domaines. SELinux est un mandatory access control (MAC) system dans le noyau Linux utilisé pour augmenter le modèle de [contrôle d'accès discrétionnaire (DAC)] existant] (http://en.wikipedia.org/wiki/Discretionary_access_control). Cette nouvelle couche offre une protection supplémentaire contre les failles de sécurité potentielles.

...

Contournements

  1. Installer SELinuxModeChanger et changez le mode SELinux à permissive
  2. https://github.com/Gritzman/libusb
0

Il existe un libusb 1.0 personnalisé qui est capable de résoudre ce problème en faisant LibusbInit en transmettant le chemin du périphérique USB, ceci peut contourner le téléchargement de la commande readdir http://www.libusb.org/ à partir de la page d'accueil elle-même.

+0

lien direct vers le commit/problème s'il vous plait? – 4ntoine