【发布时间】:2019-07-18 06:48:12
【问题描述】:
在 Android 中,我使用一个类 (UsbIso.java) 从连接的 USB 设备以同步方式传输数据。由于 Android 本身不支持同步传输,因此我不得不通过 JNA 库使用 USBFS 原生 Linux 机制来进行正确的 ioctl 调用。
在具有 32 位架构的 Android 设备(armeabi、armeabi-v7a)中,一切正常。在具有 64 位架构 (arm64-v8a) 的 Android 设备中,对 reap URB (USBDEVFS_REAPURB,reapRequest 方法内部,请参见下面的相关代码) 的 ioctl 调用返回错误 14,错误地址。我猜这是由 USBDEVFS_REAPURB 参数或 PointerByReference 参数引起的,它指向一个无效的虚拟地址,但我不知道如何解决它。
导致这个错误的UsbIso.java类中的相关代码是这样的:
public Request reapRequest (boolean wait) throws IOException {
PointerByReference urbPointer = new PointerByReference();
int func = wait ? USBDEVFS_REAPURB : USBDEVFS_REAPURBNDELAY;
int rc;
try {
rc = libc.ioctl(fileDescriptor, func, urbPointer); // <-- Error 14, bad address
} catch (LastErrorException e) {
if (e.getErrorCode() == EAGAIN && !wait) {
return null;
}
}
...
}
【问题讨论】: