android - 针对 android 的 libusb 进行编译和链接

标签 android usb

我考虑尝试编译一个特定的 C 程序,它允许通过 USB 为 android 控制 Gembird SilverShield 电源 socket 。在我的安卓 HDMI 电视棒上,这将非常有用。 this 有一个开放项目.它在 Linux 下工作并且依赖于 libusb。目标平台是 android ICS。我想在 Ubuntu Linux 上开发。我让它工作的机会有多大?需要什么步骤。设置android SDK, NDK, crosscompiler ...
有一个老问题here ,与 libusb on android 有关,但没有相关信息。
将应用程序移植到 android 自己的 usb 库是否更容易?

最佳答案

Libusb 可以在非 root 的 android 上工作(前提是设备支持 USB 主机……这非常重要,因为并非所有设备都支持)。您需要使用标准的 android USB 堆栈。然后,您可以从 USBDevice 获取设备描述符并将其传递给 libusb。

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

LibUSB 已修改here .

祝你好运!

编辑:

首先你需要定义一个广播接收器:

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);
                }
            }
        }
    }
}

现在您需要创建一个 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.
        }
    }

编辑 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)

关于android - 针对 android 的 libusb 进行编译和链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15957509/

相关文章:

android - 无法从 Google Play 控制台中的实时开发人员通知发送测试通知

java - 适用于Android的Java EWS库

android - 如何在android webview中打开相机?

c++ - 无法检测到 USB 设备

visual-c++ - 不使用Windows驱动程序工具包列出具有指定VID和PID的USB设备

macos - 如何让 Mac 使用 USBasp 检测 AVR 板并烧录程序到它?

Android:将 "internal"链接添加到 TextView 的一部分,链接到我的代码中的操作

android - 打开抽屉导航时从工具栏中移除阴影 - Material Design 支持库

java - 如何模拟 COM 端口,向其写入数据并从中读取数据?

Android 4.2.2 USB 调试 "Always allow from this computer"选项导致设备目标未知?