1*86b64dcbSAndroid Build Coastguard Workerlibusb for Android 2*86b64dcbSAndroid Build Coastguard Worker================== 3*86b64dcbSAndroid Build Coastguard Worker 4*86b64dcbSAndroid Build Coastguard WorkerBuilding: 5*86b64dcbSAndroid Build Coastguard Worker--------- 6*86b64dcbSAndroid Build Coastguard Worker 7*86b64dcbSAndroid Build Coastguard WorkerTo build libusb for Android do the following: 8*86b64dcbSAndroid Build Coastguard Worker 9*86b64dcbSAndroid Build Coastguard Worker 1. Download the latest NDK from: 10*86b64dcbSAndroid Build Coastguard Worker http://developer.android.com/tools/sdk/ndk/index.html 11*86b64dcbSAndroid Build Coastguard Worker 12*86b64dcbSAndroid Build Coastguard Worker 2. Extract the NDK. 13*86b64dcbSAndroid Build Coastguard Worker 14*86b64dcbSAndroid Build Coastguard Worker 3. Open a shell and make sure there exist an NDK global variable 15*86b64dcbSAndroid Build Coastguard Worker set to the directory where you extracted the NDK. 16*86b64dcbSAndroid Build Coastguard Worker 17*86b64dcbSAndroid Build Coastguard Worker 4. Change directory to libusb's "android/jni" 18*86b64dcbSAndroid Build Coastguard Worker 19*86b64dcbSAndroid Build Coastguard Worker 5. Run "$NDK/ndk-build". 20*86b64dcbSAndroid Build Coastguard Worker 21*86b64dcbSAndroid Build Coastguard WorkerThe libusb library, examples and tests can then be found in: 22*86b64dcbSAndroid Build Coastguard Worker "android/libs/$ARCH" 23*86b64dcbSAndroid Build Coastguard Worker 24*86b64dcbSAndroid Build Coastguard WorkerWhere $ARCH is one of: 25*86b64dcbSAndroid Build Coastguard Worker armeabi 26*86b64dcbSAndroid Build Coastguard Worker armeabi-v7a 27*86b64dcbSAndroid Build Coastguard Worker mips 28*86b64dcbSAndroid Build Coastguard Worker mips64 29*86b64dcbSAndroid Build Coastguard Worker x86 30*86b64dcbSAndroid Build Coastguard Worker x86_64 31*86b64dcbSAndroid Build Coastguard Worker 32*86b64dcbSAndroid Build Coastguard WorkerInstalling: 33*86b64dcbSAndroid Build Coastguard Worker----------- 34*86b64dcbSAndroid Build Coastguard Worker 35*86b64dcbSAndroid Build Coastguard WorkerIf you wish to use libusb from native code in own Android application 36*86b64dcbSAndroid Build Coastguard Workerthen you should add the following line to your Android.mk file: 37*86b64dcbSAndroid Build Coastguard Worker 38*86b64dcbSAndroid Build Coastguard Worker include $(PATH_TO_LIBUSB_SRC)/android/jni/libusb.mk 39*86b64dcbSAndroid Build Coastguard Worker 40*86b64dcbSAndroid Build Coastguard WorkerYou will then need to add the following lines to the build 41*86b64dcbSAndroid Build Coastguard Workerconfiguration for each native binary which uses libusb: 42*86b64dcbSAndroid Build Coastguard Worker 43*86b64dcbSAndroid Build Coastguard Worker LOCAL_C_INCLUDES += $(LIBUSB_ROOT_ABS) 44*86b64dcbSAndroid Build Coastguard Worker LOCAL_SHARED_LIBRARIES += libusb1.0 45*86b64dcbSAndroid Build Coastguard Worker 46*86b64dcbSAndroid Build Coastguard WorkerThe Android build system will then correctly include libusb in the 47*86b64dcbSAndroid Build Coastguard Workerapplication package (APK) file, provided ndk-build is invoked before 48*86b64dcbSAndroid Build Coastguard Workerthe package is built. 49*86b64dcbSAndroid Build Coastguard Worker 50*86b64dcbSAndroid Build Coastguard Worker 51*86b64dcbSAndroid Build Coastguard WorkerRuntime Permissions: 52*86b64dcbSAndroid Build Coastguard Worker-------------------- 53*86b64dcbSAndroid Build Coastguard Worker 54*86b64dcbSAndroid Build Coastguard WorkerThe Runtime Permissions on Android can be transferred from Java to Native 55*86b64dcbSAndroid Build Coastguard Workerover the following approach: 56*86b64dcbSAndroid Build Coastguard Worker 57*86b64dcbSAndroid Build Coastguard Worker JAVA: 58*86b64dcbSAndroid Build Coastguard Worker 59*86b64dcbSAndroid Build Coastguard Worker --> Obtain USB permissions over the android.hardware.usb.UsbManager class 60*86b64dcbSAndroid Build Coastguard Worker 61*86b64dcbSAndroid Build Coastguard Worker usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); 62*86b64dcbSAndroid Build Coastguard Worker HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList(); 63*86b64dcbSAndroid Build Coastguard Worker for (UsbDevice usbDevice : deviceList.values()) { 64*86b64dcbSAndroid Build Coastguard Worker usbManager.requestPermission(usbDevice, mPermissionIntent); 65*86b64dcbSAndroid Build Coastguard Worker } 66*86b64dcbSAndroid Build Coastguard Worker 67*86b64dcbSAndroid Build Coastguard Worker --> Get the native FileDescriptor of the UsbDevice and transfer it to 68*86b64dcbSAndroid Build Coastguard Worker Native over JNI or JNA 69*86b64dcbSAndroid Build Coastguard Worker 70*86b64dcbSAndroid Build Coastguard Worker UsbDeviceConnection usbDeviceConnection = usbManager.openDevice(camDevice); 71*86b64dcbSAndroid Build Coastguard Worker int fileDescriptor = usbDeviceConnection.getFileDescriptor(); 72*86b64dcbSAndroid Build Coastguard Worker 73*86b64dcbSAndroid Build Coastguard Worker --> JNA sample method: 74*86b64dcbSAndroid Build Coastguard Worker 75*86b64dcbSAndroid Build Coastguard Worker JNA.INSTANCE.set_the_native_Descriptor(fileDescriptor); 76*86b64dcbSAndroid Build Coastguard Worker 77*86b64dcbSAndroid Build Coastguard Worker NATIVE: 78*86b64dcbSAndroid Build Coastguard Worker 79*86b64dcbSAndroid Build Coastguard Worker --> Initialize libusb on Android 80*86b64dcbSAndroid Build Coastguard Worker 81*86b64dcbSAndroid Build Coastguard Worker set_the_native_Descriptor(int fileDescriptor) { 82*86b64dcbSAndroid Build Coastguard Worker libusb_context *ctx; 83*86b64dcbSAndroid Build Coastguard Worker libusb_device_handle *devh; 84*86b64dcbSAndroid Build Coastguard Worker libusb_set_option(&ctx, LIBUSB_OPTION_NO_DEVICE_DISCOVERY, NULL); 85*86b64dcbSAndroid Build Coastguard Worker libusb_init(&ctx); 86*86b64dcbSAndroid Build Coastguard Worker libusb_wrap_sys_device(NULL, (intptr_t)fileDescriptor, &devh); 87*86b64dcbSAndroid Build Coastguard Worker } 88*86b64dcbSAndroid Build Coastguard Worker /* From this point you can regularly use all libusb functions as usual */ 89*86b64dcbSAndroid Build Coastguard Worker 90*86b64dcbSAndroid Build Coastguard Worker About LIBUSB_OPTION_NO_DEVICE_DISCOVERY: 91*86b64dcbSAndroid Build Coastguard Worker 92*86b64dcbSAndroid Build Coastguard Worker The method libusb_set_option(&ctx, LIBUSB_OPTION_NO_DEVICE_DISCOVERY, NULL) 93*86b64dcbSAndroid Build Coastguard Worker does not affect the ctx. 94*86b64dcbSAndroid Build Coastguard Worker It allows initializing libusb on unrooted Android devices by skipping 95*86b64dcbSAndroid Build Coastguard Worker the device enumeration. 96*86b64dcbSAndroid Build Coastguard Worker 97*86b64dcbSAndroid Build Coastguard WorkerRooted Devices: 98*86b64dcbSAndroid Build Coastguard Worker--------------- 99*86b64dcbSAndroid Build Coastguard Worker 100*86b64dcbSAndroid Build Coastguard Worker For rooted devices the code using libusb could be executed as root 101*86b64dcbSAndroid Build Coastguard Worker using the "su" command. An alternative would be to use the "su" command 102*86b64dcbSAndroid Build Coastguard Worker to change the permissions on the appropriate /dev/bus/usb/ files. 103*86b64dcbSAndroid Build Coastguard Worker 104*86b64dcbSAndroid Build Coastguard Worker Users have reported success in using android.hardware.usb.UsbManager 105*86b64dcbSAndroid Build Coastguard Worker to request permission to use the UsbDevice and then opening the 106*86b64dcbSAndroid Build Coastguard Worker device. The difficulties in this method is that there is no guarantee 107*86b64dcbSAndroid Build Coastguard Worker that it will continue to work in the future Android versions, it 108*86b64dcbSAndroid Build Coastguard Worker requires invoking Java APIs and running code to match each 109*86b64dcbSAndroid Build Coastguard Worker android.hardware.usb.UsbDevice to a libusb_device. 110*86b64dcbSAndroid Build Coastguard Worker 111*86b64dcbSAndroid Build Coastguard Worker For a rooted device it is possible to install libusb into the system 112*86b64dcbSAndroid Build Coastguard Worker image of a running device: 113*86b64dcbSAndroid Build Coastguard Worker 114*86b64dcbSAndroid Build Coastguard Worker 1. Enable ADB on the device. 115*86b64dcbSAndroid Build Coastguard Worker 116*86b64dcbSAndroid Build Coastguard Worker 2. Connect the device to a machine running ADB. 117*86b64dcbSAndroid Build Coastguard Worker 118*86b64dcbSAndroid Build Coastguard Worker 3. Execute the following commands on the machine 119*86b64dcbSAndroid Build Coastguard Worker running ADB: 120*86b64dcbSAndroid Build Coastguard Worker 121*86b64dcbSAndroid Build Coastguard Worker # Make the system partition writable 122*86b64dcbSAndroid Build Coastguard Worker adb shell su -c "mount -o remount,rw /system" 123*86b64dcbSAndroid Build Coastguard Worker 124*86b64dcbSAndroid Build Coastguard Worker # Install libusb 125*86b64dcbSAndroid Build Coastguard Worker adb push obj/local/armeabi/libusb1.0.so /sdcard/ 126*86b64dcbSAndroid Build Coastguard Worker adb shell su -c "cat > /system/lib/libusb1.0.so < /sdcard/libusb1.0.so" 127*86b64dcbSAndroid Build Coastguard Worker adb shell rm /sdcard/libusb1.0.so 128*86b64dcbSAndroid Build Coastguard Worker 129*86b64dcbSAndroid Build Coastguard Worker # Install the samples and tests 130*86b64dcbSAndroid Build Coastguard Worker for B in listdevs fxload xusb sam3u_benchmark hotplugtest stress 131*86b64dcbSAndroid Build Coastguard Worker do 132*86b64dcbSAndroid Build Coastguard Worker adb push "obj/local/armeabi/$B" /sdcard/ 133*86b64dcbSAndroid Build Coastguard Worker adb shell su -c "cat > /system/bin/$B < /sdcard/$B" 134*86b64dcbSAndroid Build Coastguard Worker adb shell su -c "chmod 0755 /system/bin/$B" 135*86b64dcbSAndroid Build Coastguard Worker adb shell rm "/sdcard/$B" 136*86b64dcbSAndroid Build Coastguard Worker done 137*86b64dcbSAndroid Build Coastguard Worker 138*86b64dcbSAndroid Build Coastguard Worker # Make the system partition read only again 139*86b64dcbSAndroid Build Coastguard Worker adb shell su -c "mount -o remount,ro /system" 140*86b64dcbSAndroid Build Coastguard Worker 141*86b64dcbSAndroid Build Coastguard Worker # Run listdevs to 142*86b64dcbSAndroid Build Coastguard Worker adb shell su -c "listdevs" 143*86b64dcbSAndroid Build Coastguard Worker 144*86b64dcbSAndroid Build Coastguard Worker 4. If your device only has a single OTG port then ADB can generally 145*86b64dcbSAndroid Build Coastguard Worker be switched to using Wifi with the following commands when connected 146*86b64dcbSAndroid Build Coastguard Worker via USB: 147*86b64dcbSAndroid Build Coastguard Worker 148*86b64dcbSAndroid Build Coastguard Worker adb shell netcfg 149*86b64dcbSAndroid Build Coastguard Worker # Note the wifi IP address of the phone 150*86b64dcbSAndroid Build Coastguard Worker adb tcpip 5555 151*86b64dcbSAndroid Build Coastguard Worker # Use the IP address from netcfg 152*86b64dcbSAndroid Build Coastguard Worker adb connect 192.168.1.123:5555 153