| 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 | |
| mips | |
| mips64 | |
| x86 | |
| x86_64 | |
| 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 /sdcard/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. |