编译和链接libusb for android

hig*_*guy 14 usb android

我考虑尝试编译某个C程序,它允许通过USB为Android控制Gembird SilverShield电源插座.在我的Android HDMI电视棒上,这将非常有用.有一个开放的项目.它在Linux下工作,依赖于libusb.目标平台是android ICS.我想在Ubuntu Linux上开发.我有什么机会让它发挥作用?有哪些必要步骤.设定Android SDK,NDK,交叉编译器...
有一个老问题,在这里,与libusb在Android上,但没有信息的方式有关.
是否可以更轻松地将应用程序移植到机器人自己的USB库?

Goz*_*Goz 23

Libusb可以在非root用户上运行(假设设备支持USB主机......这非常重要,因为并非所有设备都这样做).你需要使用标准的android USB堆栈.然后,您可以从USBDevice获取设备描述符并将其传递给libusb.

不幸的是你还需要修改libusb.幸运的是,其他人已经解释了如何修改LibUSB.

LibUSB已在此处进行了修改.

祝好运!

编辑:

首先,您需要定义广播接收器:

private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() 
{
    public void onReceive(Context context, Intent intent)
    {
        String action = intent.getAction();
        if (ACTION_USB_PERMISSION.equals(action)) 
        {
            synchronized (this) 
            {
                UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);

                if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) 
                {
                    if(device != null)
                    {
                        UsbDeviceConnection deviceConnection    = mUsbManager.openDevice( device );
                        Log.d( "USB",  deviceConnection.getSerial() );
                    }
                } 
                else 
                {
                    Log.d( "USB", "permission denied for device " + device);
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您需要创建一个USBManager并枚举设备:

    mUsbManager         = (UsbManager) getSystemService( Context.USB_SERVICE );
    HashMap< String, UsbDevice > stringDeviceMap    =       mUsbManager.getDeviceList();
    Collection< UsbDevice > usbDevices              = stringDeviceMap.values();

    mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent( ACTION_USB_PERMISSION ), 0 );
    IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
    registerReceiver( mUsbReceiver, filter );

    Iterator< UsbDevice > usbDeviceIter             = usbDevices.iterator();
    while( usbDeviceIter.hasNext() )
    {
        if ( USBDeviceValid( usbDevice ) )
        {
            // Request permission to access the device.
            mUsbManager.requestPermission( usbDevice, mPermissionIntent );

            // Open the device.
            UsbDeviceConnection connection = mUsbManager.openDevice( usbDevice );
            int fd = connection.getFileDescriptor();

            // Now pass the file descriptor to libusb through a native call.
        }
    }
Run Code Online (Sandbox Code Playgroud)

编辑2:

获取libusb构建只是将文件放在方便的位置(我将它们放在jni/libusb中),然后将以下行添加到Android.mk中:

include $(CLEAR_VARS)
LOCAL_MODULE    := libusb
LOCAL_SRC_FILES := libusb/core.c libusb/descriptor.c libusb/io.c libusb/sync.c libusb/os/linux_usbfs.c

LOCAL_LDLIBS    := -llog
include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)