安卓L | libusb_init 返回 LIBUSB_ERROR_OTHER (-99)

Posted

技术标签:

【中文标题】安卓L | libusb_init 返回 LIBUSB_ERROR_OTHER (-99)【英文标题】:Android L | libusb_init returns LIBUSB_ERROR_OTHER (-99) 【发布时间】:2014-10-29 00:22:54 【问题描述】:

我尝试按照this approach 中的建议在未植根的 Nexus 5 上使用libusb(通过将 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 设备。谁能解释一下原因?

【问题讨论】:

【参考方案1】:

这个 libusb 分支中已经有一个修复:

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

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

【讨论】:

感谢回复,但我更喜欢github.com/Gritzman/libusb,因为Gritzman的解决方案已经在没有修改libusb.h的情况下实施 @CAMOBAP 我正在尝试使用 Gritzman 的 libusb 版本。如何传入文件描述符?如何为 libusb_open() 第一个参数获取 libusb_device?谢谢。 @AntaoAlmada 看看github.com/Gritzman/libusb/blob/master/jni/usb/os/linux_usbfs.c(使用 Android 的 cmets)。无需修改接口和传递文件描述符【参考方案2】:

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

更新

Security Enhancements in Android 5.0

...

使用SELinux 增强的Android 沙盒。 Android 现在要求 SELinux 在所有域的强制模式下。 SELinux 是 Linux 内核中的 mandatory access control (MAC) system,用于增强现有的 [自主访问控制 (DAC) 安全] 模型](http://en.wikipedia.org/wiki/Discretionary_access_control)。这一新层提供了针对潜在安全漏洞的额外保护。

...

解决方法

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

【讨论】:

【参考方案3】:

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

【讨论】:

请直接链接到提交/问题?

以上是关于安卓L | libusb_init 返回 LIBUSB_ERROR_OTHER (-99)的主要内容,如果未能解决你的问题,请参考以下文章

记一次微信小程序在安卓的白屏问题

安卓执行机制JNIDalvikART之间的比較 。android L 改动执行机制。

js怎么监听安卓返回键

我用ionic框架做的app,但是安卓手机的返回键返回上一个页面,有几个页面怎么都返回不了

开发安卓软件怎样按下按钮直接执行shell命令并返回对话框数值?

安卓开发重写onBackPressed()方法不能处理对话框返回事件