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

     2023-04-17     167

关键词:

【中文标题】安卓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/ 从主页本身下载。

【讨论】:

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

C ++:返回值是L值吗?

】C++:返回值是L值吗?【英文标题】:C++:isreturnvalueaL-value?【发布时间】:2011-08-3123:58:43【问题描述】:考虑这段代码:structfoointa;;fooq()foof;f.a=4;returnf;intmain()fooi;i.a=5;q()=i;没有编译器抱怨它,即使是Clang。为什么q()=...行是正确的... 查看详情

返回最新“连续”数据的行

】返回最新“连续”数据的行【英文标题】:Returnrowsofthelatest\'streak\'ofdata【发布时间】:2012-04-0402:51:27【问题描述】:给定一个包含以下数据的简单表格:id|result|played----+--------+------------7|L|2012-01-076|L|2012-01-065|L|2012-01-054|W|2012-01... 查看详情

第八周编程——线性表

...emTypegetElem(List,int);//从L中取出位置i的元素e,0≤i<size,返回e,否则返回-1intsearch(List,ElemType);//搜索元素e在L中的位置。若成功,返回e的位置;否则,返回-1intinsert(List*,ElemType);//将元素e插入到L适当的位置。若成功,返回e的位置... 查看详情

二分模板总结(代码片段)

case1:要找某个值,返回有没有找到trueorfalsel=0,r=nums.size()-1while(l<=r)l=mid+1r=mid-1(不用返回下表,所以返回trueorfalse即可)case2:要找某个值,返回下标l=0,r=nums.size()-1while(l<r)l=mid+1r=midreturn... 查看详情

golang:list(代码片段)

List的接口1funcNew()*List//创建List2func(l*List)Back()*Element//返回List的上一个元素3func(l*List)Front()*Element//返回List下一个元素4func(l*List)Init()*List//初始化List5func(l*List)InsertAfter(vinterface,mark*Element)*Element//在指定节点后插入,成功返回插入节... 查看详情

electronjs require() 如何根据L值/变量名返回不同的对象

】electronjsrequire()如何根据L值/变量名返回不同的对象【英文标题】:Howdoeselectronjsrequire()returndifferentobjectsbasedonLvalue/variablename【发布时间】:2021-02-0805:41:09【问题描述】:我目前正在接触electronjs,直到这次尝试我还没有处理过jav... 查看详情

试图返回结构指针(代码片段)

...n0;list*assign()list*ptr=(list*)malloc(sizeof(list));returnptr;你错误的返回,你没有给你的结构命名。另一答案你在代码中写了'return'而不​​是'return'。检查你的最后几行。 查看详情

数据结构篇————线性表(代码片段)

...操作,建立一个空的线性表。ListEmpty(L):若线性表为空,返回true,否则返回false。ClearList(*L):线性表清空。GetElem(L,i,*e):将线性表L中第i个位置元素返回给e。LocateElem(L,e):在线性表L中查找与给定值e相等的元素,如果查找成功,返回该... 查看详情

为啥 dict(k=4, z=2).update(dict(l=1)) 在 Python 中返回 None?

】为啥dict(k=4,z=2).update(dict(l=1))在Python中返回None?【英文标题】:Whydoesdict(k=4,z=2).update(dict(l=1))returnNoneinPython?为什么dict(k=4,z=2).update(dict(l=1))在Python中返回None?【发布时间】:2013-08-0422:59:38【问题描述】:为什么dict(k=4,z=2).update(di 查看详情

二分模板总结(代码片段)

case1:要找某个值,返回有没有找到trueorfalsel=0,r=nums.size()-1while(l<=r)l=mid+1r=mid-1(不用返回下表,所以返回trueorfalse即可)case2:要找某个值,返回下标l=0,r=nums.size()-1while(l&l 查看详情

二分模板总结(代码片段)

case1:要找某个值,返回有没有找到trueorfalsel=0,r=nums.size()-1while(l<=r)l=mid+1r=mid-1(不用返回下表,所以返回trueorfalse即可)case2:要找某个值,返回下标l=0,r=nums.size()-1while(l&l 查看详情

python一个名为longestrun的函数,它将一个名为l的整数列表作为参数(假设l不为空)。此函数返回lengt(代码片段)

查看详情

4.14上午

...配置模式(conft)l 进入交换机端口视图模式(intf0/1)l 返回到上级模式(exit)l 从全局以下模式返回到特权模式(end)l 帮助信息(如?、co?、copy?)l 命令简写(如conft)l&nbs 查看详情

用结构比较分数

...应该比较存储在两个结构中的两个分数。如果分数L=分数R返回0如果L>R返回1如果R>L返回-1这是我现在的代码:intcompare_fractions(FractionL,FractionR)doublez=(L.numer/L.denom)-(R.numer/R.de 查看详情

带有 nRF24L01+ SPI 的 Tiva C 系列始终返回 STATUS 寄存器

】带有nRF24L01+SPI的TivaC系列始终返回STATUS寄存器【英文标题】:TivaCserieswithnRF24L01+SPIalwaysreturnstheSTATUSregister【发布时间】:2015-07-1515:47:33【问题描述】:我遇到了一个和这个帖子很相似的问题:TIvaCSeriesproblemswithI2CInterface我正在... 查看详情

数据结构(代码片段)

...=0;i<L->length;i++) cout<<L->data[i]; cout<<endl; 4.返回L中第一个值域与e相等的逻辑位序,若存在,则返回0LocateElem(L,e) for(inti=0;i<L->length;i++) if(L->data[i]==e) returni+1; return0;5.用e返回L中第i个元素的值GetElem(L,i,&e) if... 查看详情

fft的源码含义

...变换的N个虚部//// 出口参数:// fr[]: l=0, 返回傅立叶变换的实部// l=1, 返回逆傅立叶变换的实部// fi[]: l=0, 返回傅立叶变换的虚部// l=1, 返回逆傅立叶变换的虚部// pr[]: il=1,i=0 时... 查看详情

写一个函数`smallest_absentt`,返回`l`中不存在的最小自然整数(代码片段)

写一个签名函数smallest_absent:int_list->int,如调用smaller_absentl返回l中不存在的最小自然整数letsmallest_absentl=matchlwith|[]->0|_->letm=ref(0,false)inwhile!m.(1)=falsedoif(memlm.(0))then!m.(1):=true;elseincr(m.(0) 查看详情