我正尝试通过OTG与基于Android的智能手机的USB设备进行通信。我能够使用Android USB Host API与我的设备通信。 USB Host API解决方案的问题是性能(单个批量传输受16384字节限制)。
libusb可以执行更大的请求,现在我尝试使用Android NDK集成它。我成功编译了Android的libusb源甚至initUSB()
,但libusb_open(dev, &dev_handle)
返回-3(拒绝访问)。
如何传递文件描述符
int fd = connection.getFileDescriptor()
在Android USB Host API下获取USB_PERMISSION并在libusb下获取USB设备后到libusb?
答案 0 :(得分:4)
这就是你要找的东西
https://github.com/kuldeepdhaka/libusb/tree/android-open2
只需将其编译并放入。:)
请参阅"如何使用Android"完整用法部分。
我对libusb做了所有必要的修改(我也使用它) 它有SELinux修复" Android 5.0" +也。
答案 1 :(得分:1)
另见 https://github.com/libusb/libusb/wiki/Android,它现在稍微讨论了 android。以下是提议的自述文件更改 (2021-02) 中的引述:
Runtime Permissions:
--------------------
The Runtime Permissions on Android can be transfered from Java to Native over the following approach:
Java:
// obtaining the Usb Permissions over the android.hardware.usb.UsbManager class
usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();
for (UsbDevice usbDevice : deviceList.values()) { usbManager.requestPermission(usbDevice, mPermissionIntent); }
// get the native FileDescriptor of the UsbDevice and transfer it to Native over JNI or JNA
UsbDeviceConnection usbDeviceConnection = usbManager.openDevice(camDevice);
int fileDescriptor = usbDeviceConnection.getFileDescriptor();
// JNA sample method:
JNA.INSTANCE.set_the_native_Descriptor(fileDescriptor);
Native:
// Initialize LibUsb on Android
set_the_native_Descriptor(int fileDescriptor) {
libusb_context *ctx;
libusb_device_handle *devh;
libusb_set_option(&ctx, LIBUSB_OPTION_WEAK_AUTHORITY, NULL); // important for Android
libusb_init(&ctx);
libusb_wrap_sys_device(NULL, (intptr_t)fileDescriptor, &devh);
// From this point you can regulary use all LibUsb functions as usual.
}