9

我正在尝试通过 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 并在 libusb 下获得 USB 设备访问权限?

4

2 回答 2

5

这就是你要找的。
https://github.com/kuldeepdhaka/libusb/tree/android-open2
只需编译它并将其放入。:)
请参阅“Android 操作指南”部分以了解完整用法。

我对 libusb 进行了所有必要的修改(我也在使用它)。
它也有针对“Android 5.0”+ 的 SELinux 修复程序。

于 2015-11-02T19:52:32.587 回答
2

另请参阅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.
  }
于 2021-02-03T01:01:52.150 回答