从Android USB附件读取引发ENODEV IOException

从Android USB附件读取引发ENODEV IOException,android,usb,libusb,Android,Usb,Libusb,所以我已经实现了安卓USB附件API,这样我就可以将手机插入运行linux的笔记本电脑,并将手机置于USB附件模式。然后我可以访问附件,打开它,并开始读写它。我的代码看起来与中的示例几乎相同。主要区别在于我使用单独的读写方法,并通过JNI从本机代码访问它们 这就是它变得有趣的地方。在成功读/写一两秒钟后,我的笔记本电脑的大容量传输写入开始出现超时错误,然后对Android中USB附件的读取调用抛出一个带有ENODEV错误代码的IOException。这是在电缆仍然连接的情况下,UsbManage

所以我已经实现了安卓USB附件API,这样我就可以将手机插入运行linux的笔记本电脑,并将手机置于USB附件模式。然后我可以访问附件,打开它,并开始读写它。我的代码看起来与中的示例几乎相同。主要区别在于我使用单独的读写方法,并通过JNI从本机代码访问它们

这就是它变得有趣的地方。在成功读/写一两秒钟后,我的笔记本电脑的大容量传输写入开始出现超时错误,然后对Android中USB附件的读取调用抛出一个带有ENODEV错误代码的IOException。这是在电缆仍然连接的情况下,UsbManager仍然在列表中列出了附件,我仍然拥有对它的许可

更奇怪的是,我发现如果我在读循环中加上100毫秒的睡眠,问题基本上就消失了(尽管有时还会发生)。在那里睡觉不仅是一件可怕的事情,而且会给我的应用程序带来无法忍受的延迟。睡眠时间越短,黑客攻击的效果就越差,在10毫秒的睡眠时间内是无效的

我使用大容量传输传输大约20-30kbps的实时数据(但实时性不高,大容量传输不够),传输大小在50到800字节之间,频率约为20-30Hz。这可能是USB的限制吗?我对它没有太多的经验,所以我基本上把它当作一个网络插座来对待。我是否应该将较小的消息排队,并以较低频率但较大的传输量一起发送?小型、高频批量传输是否存在问题?我会调查的,但我基本上是在抓救命稻草

硬件:

  • 笔记本电脑运行的是Ubuntu 10.04,使用的是libusb1.0.0
  • 这款手机是运行Android 4.1.2的Galaxy Nexus S股票

所以,虽然我仍然不了解正在发生的一切,但实施双缓冲方案解决了我的问题

我发现全速阅读Java Android应用程序与ENODEV问题没有任何关系,这让我得出结论,Java本机接口是我问题的根源

以前,我直接从JNI以轮询方式调用的方法中读取UsbAccessory。从本机代码到Java,然后从Java到本机Android内核的转换显然让一切都变得不好

我的修复方法是从纯Java线程(无JNI调用)读/写UsbAccessory,然后缓冲该数据,以便从JNI调用的方法读/写

看起来很有魅力。之前,我在附件端得到了非常一致的发送超时,然后最终在Android端得到了如上所述的IOException,现在我没有超时,没有IOException。我仍然有点好奇到底是什么导致了这种行为,但我怀疑这需要强大的JNI功夫才能理解