libusb for Android ================== Building: --------- To build libusb for Android do the following: 1. Download the latest NDK from: http://developer.android.com/tools/sdk/ndk/index.html 2. Extract the NDK. 3. Open a shell and make sure there exist an NDK global variable set to the directory where you extracted the NDK. 4. Change directory to libusb's "android/jni" 5. Run "$NDK/ndk-build". The libusb library, examples and tests can then be found in: "android/libs/$ARCH" Where $ARCH is one of: armeabi armeabi-v7a x86 Installing: ----------- If you wish to use libusb from native code in own Android application then you should add the following line to your Android.mk file: include $(PATH_TO_LIBUSB_SRC)/android/jni/libusb.mk You will then need to add the following lines to the build configuration for each native binary which uses libusb: LOCAL_C_INCLUDES += $(LIBUSB_ROOT_ABS) LOCAL_SHARED_LIBRARIES += libusb1.0 The Android build system will then correctly include libusb in the application package (APK) file, provided ndk-build is invoked before the package is built. For a rooted device it is possible to install libusb into the system image of a running device: 1. Enable ADB on the device. 2. Connect the device to a machine running ADB. 3. Execute the following commands on the machine running ADB: # Make the system partition writable adb shell su -c "mount -o remount,rw /system" # Install libusb adb push obj/local/armeabi/libusb1.0.so /sdcard/ adb shell su -c "cat > /system/lib/libusb1.0.so < /sdcard/libusb1.0.so" adb shell rm /system/lib/libusb1.0.so # Install the samples and tests for B in listdevs fxload xusb sam3u_benchmark hotplugtest stress do adb push "obj/local/armeabi/$B" /sdcard/ adb shell su -c "cat > /system/bin/$B < /sdcard/$B" adb shell su -c "chmod 0755 /system/bin/$B" adb shell rm "/sdcard/$B" done # Make the system partition read only again adb shell su -c "mount -o remount,ro /system" # Run listdevs to adb shell su -c "listdevs" 4. If your device only has a single OTG port then ADB can generally be switched to using Wifi with the following commands when connected via USB: adb shell netcfg # Note the wifi IP address of the phone adb tcpip 5555 # Use the IP address from netcfg adb connect 192.168.1.123:5555 Runtime Permissions: -------------------- The default system configuration on most Android device will not allow access to USB devices. There are several options for changing this. If you have control of the system image then you can modify the ueventd.rc used in the image to change the permissions on /dev/bus/usb/*/*. If using this approach then it is advisable to create a new Android permission to protect access to these files. It is not advisable to give all applications read and write permissions to these files. For rooted devices the code using libusb could be executed as root using the "su" command. An alternative would be to use the "su" command to change the permissions on the appropriate /dev/bus/usb/ files. Users have reported success in using android.hardware.usb.UsbManager to request permission to use the UsbDevice and then opening the device. The difficulties in this method is that there is no guarantee that it will continue to work in the future Android versions, it requires invoking Java APIs and running code to match each android.hardware.usb.UsbDevice to a libusb_device.