Loading core/jni/android_hardware_UsbDeviceConnection.cpp +14 −8 Original line number Diff line number Diff line Loading @@ -165,19 +165,25 @@ android_hardware_UsbDeviceConnection_control_request(JNIEnv *env, jobject thiz, return -1; } jbyte* bufferBytes = NULL; if (buffer) { bufferBytes = (jbyte*)env->GetPrimitiveArrayCritical(buffer, NULL); bool is_dir_in = (requestType & 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; } if (!is_dir_in && buffer) { env->GetByteArrayRegion(buffer, start, length, bufferBytes.get()); } jint result = usb_device_control_transfer(device, requestType, request, value, index, bufferBytes + start, length, timeout); jint bytes_transferred = usb_device_control_transfer(device, requestType, request, value, index, bufferBytes.get(), length, timeout); if (bufferBytes) { env->ReleasePrimitiveArrayCritical(buffer, bufferBytes, 0); if (bytes_transferred > 0 && is_dir_in) { env->SetByteArrayRegion(buffer, start, bytes_transferred, bufferBytes.get()); } return result; return bytes_transferred; } static jint Loading Loading
core/jni/android_hardware_UsbDeviceConnection.cpp +14 −8 Original line number Diff line number Diff line Loading @@ -165,19 +165,25 @@ android_hardware_UsbDeviceConnection_control_request(JNIEnv *env, jobject thiz, return -1; } jbyte* bufferBytes = NULL; if (buffer) { bufferBytes = (jbyte*)env->GetPrimitiveArrayCritical(buffer, NULL); bool is_dir_in = (requestType & 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; } if (!is_dir_in && buffer) { env->GetByteArrayRegion(buffer, start, length, bufferBytes.get()); } jint result = usb_device_control_transfer(device, requestType, request, value, index, bufferBytes + start, length, timeout); jint bytes_transferred = usb_device_control_transfer(device, requestType, request, value, index, bufferBytes.get(), length, timeout); if (bufferBytes) { env->ReleasePrimitiveArrayCritical(buffer, bufferBytes, 0); if (bytes_transferred > 0 && is_dir_in) { env->SetByteArrayRegion(buffer, start, bytes_transferred, bufferBytes.get()); } return result; return bytes_transferred; } static jint Loading