diff options
| -rw-r--r-- | core/jni/android_hardware_UsbDeviceConnection.cpp | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/core/jni/android_hardware_UsbDeviceConnection.cpp b/core/jni/android_hardware_UsbDeviceConnection.cpp index a0228428e90e..7267eb8cb3dc 100644 --- a/core/jni/android_hardware_UsbDeviceConnection.cpp +++ b/core/jni/android_hardware_UsbDeviceConnection.cpp @@ -190,17 +190,21 @@ android_hardware_UsbDeviceConnection_bulk_request(JNIEnv *env, jobject thiz, return -1; } - jbyte* bufferBytes = NULL; - if (buffer) { - bufferBytes = (jbyte*)env->GetPrimitiveArrayCritical(buffer, NULL); + bool is_dir_in = (endpoint & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN; + jbyte *bufferBytes = (jbyte *)malloc(length); + + if (!is_dir_in && buffer) { + env->GetByteArrayRegion(buffer, start, length, bufferBytes); } - jint result = usb_device_bulk_transfer(device, endpoint, bufferBytes + start, length, timeout); + jint result = usb_device_bulk_transfer(device, endpoint, bufferBytes, length, timeout); - if (bufferBytes) { - env->ReleasePrimitiveArrayCritical(buffer, bufferBytes, 0); + if (is_dir_in && buffer) { + env->SetByteArrayRegion(buffer, start, length, bufferBytes); } + free(bufferBytes); + return result; } |