Android L | libusb_init返回LIBUSB_ERROR_OTHER(-99)

时间:2014-09-04 09:48:50

标签: android android-ndk android-5.0-lollipop libusb

我尝试在this approach中建议使用libusb未植根的Nexus 5(通过将usb文件描述符从java传输到本机端)。

我的应用程序通过UsbManager.requestPermission请求权限,然后运行调用libusb_init的原生方法来创建libusb_context

但是libusb_init会返回LIBUSB_ERROR_OTHER代码(-99)。在挖掘代码后,我明白为什么会发生这种情况。 libusb报告'could not find usbfs'因为opendir("/dev/bus/usb")返回0

同样来自adb shell我无法执行ls /dev,这很奇怪,因为我有权利(在华为U8950-1上我有同样的权利):

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

看起来下面描述的方法不适用于所有Android设备。有人可以解释原因吗?

3 个答案:

答案 0 :(得分:3)

这个libusb fork已经有了修复:

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

现在,您不仅需要传递文件描述符,还需要通过UsbDevice.getDeviceName()传递设备文件路径。

答案 1 :(得分:2)

看起来Android L对访问/dev目录有额外的限制。我对此没有更多的想法

<强>更新

Security Enhancements in Android 5.0

  

...

     

使用SELinux加强Android沙箱。 Android现在在所有域的强制模式下都需要SELinuxSELinux是Linux内核中的mandatory access control (MAC) system,用于扩充现有的[自主访问控制(DAC)安全]模型](http://en.wikipedia.org/wiki/Discretionary_access_control)。这个新层提供了额外的保护,以防止潜在的安全漏洞。

     

...

<强>变通方法

  1. 安装SELinuxModeChanger并将SELinux模式更改为permissive
  2. https://github.com/Gritzman/libusb

答案 2 :(得分:0)

有一个自定义libusb 1.0能够通过传递usb设备的路径来执行LibusbInit来解决这个问题,这可以绕过来自主页网页的readdir命令http://www.libusb.org/下载。