6

我正在开发一个需要连接到 USB 设备的 android 应用程序。

我在 Windows 上开发了一个类似的应用程序,并且我有用 c 编写的驱动程序。

我想为我的 android 应用程序开发一个 USB 驱动程序。我想知道为android开发USB驱动程序需要什么。

或者

我可以使用ndk重用用c编写的代码吗?

谢谢,

4

2 回答 2

9

首先,Android 实际上就是 Linux,所以如果你在谈论“为我的 Android 应用程序编写一个 USB 驱动程序”,你应该说“为你的特定设备编写一个 linux USB 驱动程序”。

接下来,您将不得不以某种方式访问​​您的设备。当你为 linux 编写了 USB 驱动程序后,你将得到的可能是 /dev/ 中的某个文件节点。我猜你想为 Android 不提供好的 JAVA api 的非标准 USB 设备(如鼠标/操纵杆/大容量存储器)创建驱动程序?在这种情况下,您将不得不编写一个本机库(可能基于您已经拥有的 c 代码)并使用 NDK 编译它。您从中获得的 .so 文件可以打包在您的 Android 应用程序中,然后可以使用它与您的 USB 设备通信。

所以总结一下:

usb 设备驱动程序 -> 创建内核模块或将驱动程序嵌入到您的 linux 内核中:这是 linux usb 驱动程序编程的东西,您应该能够在网上找到足够的指南。如果您真的创建了 Windows USB 驱动程序,您应该能够重用部分 c 代码。

本机包装库来访问您的设备(.so 文件,如果您习惯于 Windows 术语,则为 .dll)-> 创建一个 NDK 项目,该项目打开正确的设备节点并正确读取/写入您的设备。

android app -> 包含 .so 文件并通过 jni 访问其本机 (c) 方法。您可以使用 javah 或 swig 等工具从库的头文件中生成 jni 代码。

于 2012-10-05T07:34:49.253 回答
5

上一个答案假定您对设备具有 root 访问权限,并且不适合大规模部署。自 api 版本 12 以来,android 提供了一个 USB 接口,允许您使用低级控制通道和 USB 请求缓冲区与某些设备进行交互。

有两种类型的设备支持 usb 主机设备 usb (android) 附件设备

主机模式通常仅在平板电脑上得到很好的支持,手机可以并且确实支持它,但它们维持主机模式的能力很少而且非常依赖于相关设备的电压需求

附件模式很奇怪,因为它扩展了 USB 标准以添加额外的交换,将附件标识为“android”附件

如果上述模式对您可用,那么它们是迄今为止使用低级 c 驱动程序的更好选择,除非您完全控制它将安装到的所有设备。

这些都是 java api,可以在 google android 文档站点的 usb 下找到文档。

于 2012-10-07T23:48:48.763 回答