1acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood/* 2acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * Copyright (C) 2011 The Android Open Source Project 3acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * 4acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 5acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * you may not use this file except in compliance with the License. 6acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * You may obtain a copy of the License at 7acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * 8acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 9acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * 10acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * Unless required by applicable law or agreed to in writing, software 11acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 12acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * See the License for the specific language governing permissions and 14acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * limitations under the License. 15acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood */ 16acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 17acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood#define LOG_TAG "UsbDeviceConnectionJNI" 18acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 19acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood#include "utils/Log.h" 20acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 21acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood#include "jni.h" 22acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood#include "JNIHelp.h" 23acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood#include "android_runtime/AndroidRuntime.h" 24acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 25acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood#include <usbhost/usbhost.h> 26acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 27acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood#include <stdio.h> 28acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood#include <sys/types.h> 29acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood#include <sys/stat.h> 30acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood#include <fcntl.h> 31acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 32acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodusing namespace android; 33acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 34acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodstatic jfieldID field_context; 35acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 36acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodstruct usb_device* get_device_from_object(JNIEnv* env, jobject connection) 37acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood{ 38acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return (struct usb_device*)env->GetIntField(connection, field_context); 39acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood} 40acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 41acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodstatic jboolean 42acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodandroid_hardware_UsbDeviceConnection_open(JNIEnv *env, jobject thiz, jstring deviceName, 43acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood jobject fileDescriptor) 44acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood{ 45a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes int fd = jniGetFDFromFileDescriptor(env, fileDescriptor); 46acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood // duplicate the file descriptor, since ParcelFileDescriptor will eventually close its copy 47acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood fd = dup(fd); 48acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (fd < 0) 49acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return false; 50acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 51acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood const char *deviceNameStr = env->GetStringUTFChars(deviceName, NULL); 52acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood struct usb_device* device = usb_device_new(deviceNameStr, fd); 53acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (device) { 54acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood env->SetIntField(thiz, field_context, (int)device); 55acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } else { 563762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("usb_device_open failed for %s", deviceNameStr); 57acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood close(fd); 58acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 59acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 60acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood env->ReleaseStringUTFChars(deviceName, deviceNameStr); 61acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return (device != NULL); 62acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood} 63acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 64acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodstatic void 65acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodandroid_hardware_UsbDeviceConnection_close(JNIEnv *env, jobject thiz) 66acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood{ 675baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("close\n"); 68acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood struct usb_device* device = get_device_from_object(env, thiz); 69acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (device) { 70acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood usb_device_close(device); 71acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood env->SetIntField(thiz, field_context, 0); 72acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 73acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood} 74acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 75acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodstatic jint 76acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodandroid_hardware_UsbDeviceConnection_get_fd(JNIEnv *env, jobject thiz) 77acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood{ 78acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood struct usb_device* device = get_device_from_object(env, thiz); 79acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (!device) { 803762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("device is closed in native_get_fd"); 81acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return -1; 82acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 83acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return usb_device_get_fd(device); 84acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood} 85acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 86a88b42d569a91290477d8f5731a2ee43931271daMike Lockwoodstatic jbyteArray 87a88b42d569a91290477d8f5731a2ee43931271daMike Lockwoodandroid_hardware_UsbDeviceConnection_get_desc(JNIEnv *env, jobject thiz) 88a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood{ 89a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood char buffer[16384]; 90a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood int fd = android_hardware_UsbDeviceConnection_get_fd(env, thiz); 91a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood if (fd < 0) return NULL; 92a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood lseek(fd, 0, SEEK_SET); 93a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood int length = read(fd, buffer, sizeof(buffer)); 94a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood if (length < 0) return NULL; 95a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood 96a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood jbyteArray ret = env->NewByteArray(length); 97a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood if (ret) { 98a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood jbyte* bytes = (jbyte*)env->GetPrimitiveArrayCritical(ret, 0); 99a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood if (bytes) { 100a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood memcpy(bytes, buffer, length); 101a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood env->ReleasePrimitiveArrayCritical(ret, bytes, 0); 102a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood } 103a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood } 104a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood return ret; 105a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood} 106a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood 107acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodstatic jboolean 108acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodandroid_hardware_UsbDeviceConnection_claim_interface(JNIEnv *env, jobject thiz, 109acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood int interfaceID, jboolean force) 110acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood{ 111acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood struct usb_device* device = get_device_from_object(env, thiz); 112acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (!device) { 1133762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("device is closed in native_claim_interface"); 114acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return -1; 115acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 116acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 117acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood int ret = usb_device_claim_interface(device, interfaceID); 118acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (ret && force && errno == EBUSY) { 119acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood // disconnect kernel driver and try again 120acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood usb_device_connect_kernel_driver(device, interfaceID, false); 121acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood ret = usb_device_claim_interface(device, interfaceID); 122acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 123acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return ret == 0; 124acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood} 125acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 126acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodstatic jint 127acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodandroid_hardware_UsbDeviceConnection_release_interface(JNIEnv *env, jobject thiz, int interfaceID) 128acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood{ 129acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood struct usb_device* device = get_device_from_object(env, thiz); 130acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (!device) { 1313762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("device is closed in native_release_interface"); 132acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return -1; 133acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 134acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood int ret = usb_device_release_interface(device, interfaceID); 135acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (ret == 0) { 136acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood // allow kernel to reconnect its driver 137acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood usb_device_connect_kernel_driver(device, interfaceID, true); 138acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 139acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return ret; 140acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood} 141acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 142acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodstatic jint 143acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodandroid_hardware_UsbDeviceConnection_control_request(JNIEnv *env, jobject thiz, 144acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood jint requestType, jint request, jint value, jint index, 145acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood jbyteArray buffer, jint length, jint timeout) 146acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood{ 147acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood struct usb_device* device = get_device_from_object(env, thiz); 148acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (!device) { 1493762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("device is closed in native_control_request"); 150acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return -1; 151acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 152acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 153acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood jbyte* bufferBytes = NULL; 154acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (buffer) { 155acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (env->GetArrayLength(buffer) < length) { 1568451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes jniThrowException(env, "java/lang/ArrayIndexOutOfBoundsException", NULL); 157acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return -1; 158acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 159acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood bufferBytes = env->GetByteArrayElements(buffer, 0); 160acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 161acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 162acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood jint result = usb_device_control_transfer(device, requestType, request, 163acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood value, index, bufferBytes, length, timeout); 164acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 165acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (bufferBytes) 166acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood env->ReleaseByteArrayElements(buffer, bufferBytes, 0); 167acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 168acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return result; 169acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood} 170acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 171acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodstatic jint 172acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodandroid_hardware_UsbDeviceConnection_bulk_request(JNIEnv *env, jobject thiz, 173acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood jint endpoint, jbyteArray buffer, jint length, jint timeout) 174acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood{ 175acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood struct usb_device* device = get_device_from_object(env, thiz); 176acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (!device) { 1773762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("device is closed in native_control_request"); 178acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return -1; 179acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 180acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 181acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood jbyte* bufferBytes = NULL; 182acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (buffer) { 183acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (env->GetArrayLength(buffer) < length) { 1848451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes jniThrowException(env, "java/lang/ArrayIndexOutOfBoundsException", NULL); 185acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return -1; 186acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 187acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood bufferBytes = env->GetByteArrayElements(buffer, 0); 188acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 189acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 190acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood jint result = usb_device_bulk_transfer(device, endpoint, bufferBytes, length, timeout); 191acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 192acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (bufferBytes) 193acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood env->ReleaseByteArrayElements(buffer, bufferBytes, 0); 194acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 195acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return result; 196acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood} 197acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 198acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodstatic jobject 199acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodandroid_hardware_UsbDeviceConnection_request_wait(JNIEnv *env, jobject thiz) 200acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood{ 201acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood struct usb_device* device = get_device_from_object(env, thiz); 202acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (!device) { 2033762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("device is closed in native_request_wait"); 204acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return NULL; 205acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 206acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 207acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood struct usb_request* request = usb_request_wait(device); 208acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (request) 209acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return (jobject)request->client_data; 210acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood else 211acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return NULL; 212acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood} 213acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 214acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodstatic jstring 215acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodandroid_hardware_UsbDeviceConnection_get_serial(JNIEnv *env, jobject thiz) 216acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood{ 217acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood struct usb_device* device = get_device_from_object(env, thiz); 218acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (!device) { 2193762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("device is closed in native_request_wait"); 220acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return NULL; 221acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 222acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood char* serial = usb_device_get_serial(device); 223acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (!serial) 224acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return NULL; 225acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood jstring result = env->NewStringUTF(serial); 226acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood free(serial); 227acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return result; 228acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood} 229acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 230acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodstatic JNINativeMethod method_table[] = { 231acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood {"native_open", "(Ljava/lang/String;Ljava/io/FileDescriptor;)Z", 232acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood (void *)android_hardware_UsbDeviceConnection_open}, 233acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood {"native_close", "()V", (void *)android_hardware_UsbDeviceConnection_close}, 234acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood {"native_get_fd", "()I", (void *)android_hardware_UsbDeviceConnection_get_fd}, 235a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood {"native_get_desc", "()[B", (void *)android_hardware_UsbDeviceConnection_get_desc}, 236acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood {"native_claim_interface", "(IZ)Z",(void *)android_hardware_UsbDeviceConnection_claim_interface}, 237acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood {"native_release_interface","(I)Z", (void *)android_hardware_UsbDeviceConnection_release_interface}, 238acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood {"native_control_request", "(IIII[BII)I", 239acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood (void *)android_hardware_UsbDeviceConnection_control_request}, 240acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood {"native_bulk_request", "(I[BII)I", 241acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood (void *)android_hardware_UsbDeviceConnection_bulk_request}, 242acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood {"native_request_wait", "()Landroid/hardware/usb/UsbRequest;", 243acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood (void *)android_hardware_UsbDeviceConnection_request_wait}, 244acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood { "native_get_serial", "()Ljava/lang/String;", 245acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood (void*)android_hardware_UsbDeviceConnection_get_serial }, 246acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood}; 247acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 248acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodint register_android_hardware_UsbDeviceConnection(JNIEnv *env) 249acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood{ 250acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood jclass clazz = env->FindClass("android/hardware/usb/UsbDeviceConnection"); 251acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (clazz == NULL) { 2523762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find android/hardware/usb/UsbDeviceConnection"); 253acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return -1; 254acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 255acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood field_context = env->GetFieldID(clazz, "mNativeContext", "I"); 256acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (field_context == NULL) { 2573762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find UsbDeviceConnection.mNativeContext"); 258acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return -1; 259acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 260acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 261acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return AndroidRuntime::registerNativeMethods(env, "android/hardware/usb/UsbDeviceConnection", 262acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood method_table, NELEM(method_table)); 263acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood} 264