diff options
author | 2024-09-20 06:17:18 +0000 | |
---|---|---|
committer | 2024-09-20 06:17:18 +0000 | |
commit | 2d68f0a25b705db084b6e7aa588527cfcf63575c (patch) | |
tree | f6fe52e837ad803b4948a04d73d0460315fd5f62 | |
parent | 850c53840b8e3a12e3fa815d6afcc07ea0c6e625 (diff) | |
parent | 04cfe01ff73b929335cbbf2036cdac2cdd22f8ef (diff) |
Merge "usb: Use Get/SetByteArrayRegion in bulkTransfer" into main
-rw-r--r-- | core/jni/android_hardware_UsbDeviceConnection.cpp | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/core/jni/android_hardware_UsbDeviceConnection.cpp b/core/jni/android_hardware_UsbDeviceConnection.cpp index a0228428e90e..b1221ee38db3 100644 --- a/core/jni/android_hardware_UsbDeviceConnection.cpp +++ b/core/jni/android_hardware_UsbDeviceConnection.cpp @@ -190,18 +190,25 @@ 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; + std::unique_ptr<jbyte[]> bufferBytes(new (std::nothrow) jbyte[length]); + if (!bufferBytes) { + jniThrowException(env, "java/lang/OutOfMemoryError", NULL); + return -1; } - jint result = usb_device_bulk_transfer(device, endpoint, bufferBytes + start, length, timeout); + if (!is_dir_in && buffer) { + env->GetByteArrayRegion(buffer, start, length, bufferBytes.get()); + } - if (bufferBytes) { - env->ReleasePrimitiveArrayCritical(buffer, bufferBytes, 0); + jint bytes_transferred = + usb_device_bulk_transfer(device, endpoint, bufferBytes.get(), length, timeout); + + if (bytes_transferred > 0 && is_dir_in) { + env->SetByteArrayRegion(buffer, start, bytes_transferred, bufferBytes.get()); } - return result; + return bytes_transferred; } static jobject |