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

时间:2016-06-29 14:31:14

标签: android usb

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

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

如何在API 21之前设置配置?默认情况下为DeviceConnection选择哪个UsbInterface?我确实称之为claimInterface,但它仍然无法正常工作。

有没有办法只使用API​​ 19调用,或者我可以直接使用libusb执行此操作?

1 个答案:

答案 0 :(得分:0)

我最终使用本机代码调用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是我用于从C ++调用Java UsbDeviceConnection.getFileDescriptor方法的JNI包装器 - 您的方法可能会有所不同。

这适用于API 19和21。