summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Ashish Kumar Gupta <kumarashishg@google.com> 2024-09-20 06:17:18 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2024-09-20 06:17:18 +0000
commit2d68f0a25b705db084b6e7aa588527cfcf63575c (patch)
treef6fe52e837ad803b4948a04d73d0460315fd5f62
parent850c53840b8e3a12e3fa815d6afcc07ea0c6e625 (diff)
parent04cfe01ff73b929335cbbf2036cdac2cdd22f8ef (diff)
Merge "usb: Use Get/SetByteArrayRegion in bulkTransfer" into main
-rw-r--r--core/jni/android_hardware_UsbDeviceConnection.cpp21
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