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。
我有一个需要与之通信的 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。