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

标签 android usb

我考虑尝试编译一个特定的 C 程序,该程序允许通过 Android 的 USB 控制 Gembird SilverShield 电源 socket 。在我的 Android HDMI 电视棒上,这将非常有用。有一个开放项目 this 。它在Linux下工作并依赖于libusb。目标平台是android ICS。我想在 Ubuntu Linux 上进行开发。我让它发挥作用的机会有多大?需要哪些步骤。设置android SDK、NDK、交叉编译器...
有一个较旧的问题here ,与 android 上的 libusb 相关,但没有信息如何。
将应用程序移植到 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/57750042/

相关文章:

python - 在 Windows 上检测插入的 USB

android - macbook adb 打不开界面

java - 如何避免类型转换?

c - 具有 functionfs : reading endpoint 1 not successful 的 Linux USB 小工具

c# - 如何使用 C# 通过 USB 将原始 ZPL 发送到 Zebra 打印机

java - 如何在Java中将日期格式化为带有缩写时区的格式?

python - 检测何时连接了新的 USB 设备(即插即用)

android - isAdded() 是否与 Android Fragment 中的 null != getActivity() 相同?

java - 在使用它迭代java时从arraylist中删除项目

java - 接口(interface)的概念应用于基于位置的应用程序