Android USB 主机 DeviceConnection.setInterface 在 API 级别 21 之前

Android USB host DeviceConnection.setInterface prior to API Level 21

我有一个需要与之通信的 USB 设备,我的代码使用 NDK 代码使用 JNI 调用 USB 主机 APIs。

但是它涉及对 DeviceConnection.setInterface() 的调用,这是一个 API 21+ 调用。如果我离开那个呼叫,控制和 bulkTransfers 失败。

API21之前的配置是怎么设置的? DeviceConnection 默认选择哪个 USBInterface?我确实调用了 claimInterface,但它仍然不起作用。

有什么方法可以只使用 API 19 个调用来做到这一点,或者我可以直接使用 libusb 来做到这一点吗?

我最终求助于本机代码来调用与 UsbDeviceConnection.setInterface() 相同的 usbfs 代码:

#include <linux/ioctl.h>
#include <sys/ioctl.h>

// Struct and ioctl define stolen from linux_usbfs.h
struct usbfs_setinterface {
  /* keep in sync with usbdevice_fs.h:usbdevfs_setinterface */
  unsigned int interface;
  unsigned int altsetting;
};

#define IOCTL_USBFS_SETINTF _IOR('U', 4, struct usbfs_setinterface)

// Basically the same as linux_usbfs.c
int fd = gUsbDeviceConnection.getFileDescriptor(env);
struct usbfs_setinterface setintf;

setintf.interface = CIMAX_INTERFACE;
setintf.altsetting = alternate;
int r = ioctl(fd, IOCTL_USBFS_SETINTF, &setintf);

注意 gUsbDeviceConnection.getFileDescriptor(env); line 是我的 JNI 包装器,用于从 C++ 调用 Java UsbDeviceConnection.getFileDescriptor 方法 - 您的方法可能会有所不同。

这对我有用 API 19 和 21。