安卓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 改动执行机制。
我用ionic框架做的app,但是安卓手机的返回键返回上一个页面,有几个页面怎么都返回不了