在 Android 中,我使用一个类 ( UsbIso.java ) 从连接的 USB 设备以同步方式传输数据。由于 Android 本身不支持同步传输,我不得不通过 JNA 库使用 USBFS 原生 Linux 机制来进行正确的 ioctl 调用。
在具有 32 位架构(armeabi、armeabi-v7a)的 Android 设备中,一切正常。在具有 64 位架构 (arm64-v8a) 的 Android 设备中,ioctl 调用 reap URB(USBDEVFS_REAPURB,在 reapRequest 方法内部,请参见下面的相关代码)返回错误 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;
}
}
...
}
皈依舞
素胚勾勒不出你
相关分类