libusb 加入到 Android

来源:互联网 发布:ubuntu 上网命令 编辑:程序博客网 时间:2024/06/02 13:12
1. 首先要把 usbfs 文件系统编入内核
1) 进入到 Android 源码根目录下 kernel 子目录: $cd kernel 2) 再配置 config(用的是 arch/arm/configs/omap3_beagle_android_defconfig): $make ARCH=arm omap3_evm_android_defconfig $make menuconfig 选中 Device Drivers->USB support->Support for Host-side USB->USB device filesystem(DEPRECATED) 3) 编译内核: $export PATH=<android sources>/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin:$PATH $make ARCH=arm CROSS_COMPILE=arm-eabi- uImage –j2(参见 ConfigureAndBuild rowboat - Configure and Build -.pdf) 4) 在 init.rc 脚本中的 on boot 下加入 mount usbfs none /proc/bus/usb -o devmode=0666: on boot # basic network init ifup lo hostname localhost domainname localdomain setprop net.dns1 10.51.2.40 # mount usb file system mount usbfs none /proc/bus/usb -o devmode=0666

2. 编译 libusb 库
1) 下载 libusb 源码 http://libusb.org/wiki/Libusb1.0。我选用的是 libusb-1.0.3 版本。 2) 因为用 ndk-build 来编译 libusb,所以新建一个文件夹比如叫 libusb-1.0.3,再把 1 步 下载的源码文件放到新建的文件夹下并把 1 步下载的文件重新命名为 jni。 3) 在 libusb-1.0.3/jni 下新建一个 Android.mk,其内容如下:
LOCAL_PATH := $(call my-dir) subdirs := $(addprefix $(LOCAL_PATH)/,$(addsuffix /Android.mk, \ libusb \ )) include $(subdirs)

4) 在libusb-1.0.3/jni/libusb下新一个Android.mk,其内容如下: LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS)

LOCAL_PRELINK_MODULE := false LOCAL_SRC_FILES:= \ core.c \ descriptor.c \ io.c \ sync.c \ os/linux_usbfs.c LOCAL_C_INCLUDES += \ ./ \ ./os\ ../

LOCAL_MODULE:= libusb include $(BUILD_SHARED_LIBRARY) 5) 现在进行编译话的会出现io.c:1003: error: undefined reference to ‘TIMESPEC_TO_TIMEVAL’类似的错误,可以在libusb-1.0.3/jni/libusb下的io.c中宏定义 TIMESPEC_TO_TIMEVAL解决:
#define TIMESPEC_TO_TIMEVAL(tv, ts) do { (tv)->tv_sec = (ts)->tv_sec; (tv)->tv_usec = (ts)->tv_nsec / 1000; } while (0) \ \ \ \

6) 编译libusb: $cd libusb-1.0.3/jni $ndk-build (可以参见用ndk编译c程序.pdf) 如果成功可以看到如下结果:

7) 把生成的libusb.so复制到SD卡上的Android文件系统中/system/lib下。 (注意,在复制 前要确保libusb.so是各个用户下都可运行, 如果不用chmod修改, 这样方便在Android 各种模式下能调用)

3. 验证 libusb 在 Android 中可用
1) 把 libusb 源码中 examples 目录下的 lsusb.c 复制到一个新建的目录下, 比如 lsusb/jni 下。 2) 在 lsusb/jni 下建一个 Android.mk,其内容如下:
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= lsusb.c LOCAL_MODULE := lsusb LOCAL_C_INCLUDES += /home/shishunzhong/android_development/android-ndk-r7/samples/libusb-1.0.3/jni/ LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -lusb LOCAL_SHARED_LIBRARIES := libc libusb include $(BUILD_EXECUTABLE)

(注意:LOCAL_LDLIBS 是告诉编译器我们自已用到的 libusb.so 动态库到哪去加载, 这里我把之前生成的 libusb.so 复制到 ndk-build 所调用的交叉编译的工具链库 SYSROOT 下的 usr/lib 目录下了。 如果不知道 SYSROOT 在哪里可以用$ndk-build -B V=1 命令,会让 ndk-build “揭露出”整个工具链的不同使用过程,其输出有这样一句 --sysroot=/home/shishunzhong/android_development/android_ndk-r7/platforms/andr oid-3/arch-arm;LOCAL_C_INCLUDES 是指.h 头文件到哪加载,我把它设成 libusb 源 码目录) 3) 编译: $cd lsusb/jni

$ndk-build 4) 把生成的可执行程序 lsusb 复制到 SD 卡上的 Android 文件系统中/system/bin 目录下, 并运行(注意复制前 lsusb 文件的权限) ,如果成功说明一切成切了。

原创粉丝点击