diff --git a/api/current.txt b/api/current.txt index 0ca7560da2c77..fd9284ded15b4 100644 --- a/api/current.txt +++ b/api/current.txt @@ -23151,7 +23151,7 @@ package android.mtp { method public boolean importFile(int, android.os.ParcelFileDescriptor); method public boolean open(android.hardware.usb.UsbDeviceConnection); method public android.mtp.MtpEvent readEvent(android.os.CancellationSignal); - method public boolean sendObject(int, int, android.os.ParcelFileDescriptor); + method public boolean sendObject(int, long, android.os.ParcelFileDescriptor); method public android.mtp.MtpObjectInfo sendObjectInfo(android.mtp.MtpObjectInfo); } @@ -23182,23 +23182,31 @@ package android.mtp { method public final int getAssociationDesc(); method public final int getAssociationType(); method public final int getCompressedSize(); + method public final long getCompressedSizeLong(); method public final long getDateCreated(); method public final long getDateModified(); method public final int getFormat(); method public final int getImagePixDepth(); + method public final long getImagePixDepthLong(); method public final int getImagePixHeight(); + method public final long getImagePixHeightLong(); method public final int getImagePixWidth(); + method public final long getImagePixWidthLong(); method public final java.lang.String getKeywords(); method public final java.lang.String getName(); method public final int getObjectHandle(); method public final int getParent(); method public final int getProtectionStatus(); method public final int getSequenceNumber(); + method public final long getSequenceNumberLong(); method public final int getStorageId(); method public final int getThumbCompressedSize(); + method public final long getThumbCompressedSizeLong(); method public final int getThumbFormat(); method public final int getThumbPixHeight(); + method public final long getThumbPixHeightLong(); method public final int getThumbPixWidth(); + method public final long getThumbPixWidthLong(); } public static class MtpObjectInfo.Builder { @@ -23207,24 +23215,24 @@ package android.mtp { method public android.mtp.MtpObjectInfo build(); method public android.mtp.MtpObjectInfo.Builder setAssociationDesc(int); method public android.mtp.MtpObjectInfo.Builder setAssociationType(int); - method public android.mtp.MtpObjectInfo.Builder setCompressedSize(int); + method public android.mtp.MtpObjectInfo.Builder setCompressedSize(long); method public android.mtp.MtpObjectInfo.Builder setDateCreated(long); method public android.mtp.MtpObjectInfo.Builder setDateModified(long); method public android.mtp.MtpObjectInfo.Builder setFormat(int); - method public android.mtp.MtpObjectInfo.Builder setImagePixDepth(int); - method public android.mtp.MtpObjectInfo.Builder setImagePixHeight(int); - method public android.mtp.MtpObjectInfo.Builder setImagePixWidth(int); + method public android.mtp.MtpObjectInfo.Builder setImagePixDepth(long); + method public android.mtp.MtpObjectInfo.Builder setImagePixHeight(long); + method public android.mtp.MtpObjectInfo.Builder setImagePixWidth(long); method public android.mtp.MtpObjectInfo.Builder setKeywords(java.lang.String); method public android.mtp.MtpObjectInfo.Builder setName(java.lang.String); method public android.mtp.MtpObjectInfo.Builder setObjectHandle(int); method public android.mtp.MtpObjectInfo.Builder setParent(int); method public android.mtp.MtpObjectInfo.Builder setProtectionStatus(int); - method public android.mtp.MtpObjectInfo.Builder setSequenceNumber(int); + method public android.mtp.MtpObjectInfo.Builder setSequenceNumber(long); method public android.mtp.MtpObjectInfo.Builder setStorageId(int); - method public android.mtp.MtpObjectInfo.Builder setThumbCompressedSize(int); + method public android.mtp.MtpObjectInfo.Builder setThumbCompressedSize(long); method public android.mtp.MtpObjectInfo.Builder setThumbFormat(int); - method public android.mtp.MtpObjectInfo.Builder setThumbPixHeight(int); - method public android.mtp.MtpObjectInfo.Builder setThumbPixWidth(int); + method public android.mtp.MtpObjectInfo.Builder setThumbPixHeight(long); + method public android.mtp.MtpObjectInfo.Builder setThumbPixWidth(long); } public final class MtpStorageInfo { diff --git a/api/system-current.txt b/api/system-current.txt index 6a9848e1d7658..f74d927dc3f7a 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -24538,7 +24538,7 @@ package android.mtp { method public boolean importFile(int, android.os.ParcelFileDescriptor); method public boolean open(android.hardware.usb.UsbDeviceConnection); method public android.mtp.MtpEvent readEvent(android.os.CancellationSignal); - method public boolean sendObject(int, int, android.os.ParcelFileDescriptor); + method public boolean sendObject(int, long, android.os.ParcelFileDescriptor); method public android.mtp.MtpObjectInfo sendObjectInfo(android.mtp.MtpObjectInfo); } @@ -24569,23 +24569,31 @@ package android.mtp { method public final int getAssociationDesc(); method public final int getAssociationType(); method public final int getCompressedSize(); + method public final long getCompressedSizeLong(); method public final long getDateCreated(); method public final long getDateModified(); method public final int getFormat(); method public final int getImagePixDepth(); + method public final long getImagePixDepthLong(); method public final int getImagePixHeight(); + method public final long getImagePixHeightLong(); method public final int getImagePixWidth(); + method public final long getImagePixWidthLong(); method public final java.lang.String getKeywords(); method public final java.lang.String getName(); method public final int getObjectHandle(); method public final int getParent(); method public final int getProtectionStatus(); method public final int getSequenceNumber(); + method public final long getSequenceNumberLong(); method public final int getStorageId(); method public final int getThumbCompressedSize(); + method public final long getThumbCompressedSizeLong(); method public final int getThumbFormat(); method public final int getThumbPixHeight(); + method public final long getThumbPixHeightLong(); method public final int getThumbPixWidth(); + method public final long getThumbPixWidthLong(); } public static class MtpObjectInfo.Builder { @@ -24594,24 +24602,24 @@ package android.mtp { method public android.mtp.MtpObjectInfo build(); method public android.mtp.MtpObjectInfo.Builder setAssociationDesc(int); method public android.mtp.MtpObjectInfo.Builder setAssociationType(int); - method public android.mtp.MtpObjectInfo.Builder setCompressedSize(int); + method public android.mtp.MtpObjectInfo.Builder setCompressedSize(long); method public android.mtp.MtpObjectInfo.Builder setDateCreated(long); method public android.mtp.MtpObjectInfo.Builder setDateModified(long); method public android.mtp.MtpObjectInfo.Builder setFormat(int); - method public android.mtp.MtpObjectInfo.Builder setImagePixDepth(int); - method public android.mtp.MtpObjectInfo.Builder setImagePixHeight(int); - method public android.mtp.MtpObjectInfo.Builder setImagePixWidth(int); + method public android.mtp.MtpObjectInfo.Builder setImagePixDepth(long); + method public android.mtp.MtpObjectInfo.Builder setImagePixHeight(long); + method public android.mtp.MtpObjectInfo.Builder setImagePixWidth(long); method public android.mtp.MtpObjectInfo.Builder setKeywords(java.lang.String); method public android.mtp.MtpObjectInfo.Builder setName(java.lang.String); method public android.mtp.MtpObjectInfo.Builder setObjectHandle(int); method public android.mtp.MtpObjectInfo.Builder setParent(int); method public android.mtp.MtpObjectInfo.Builder setProtectionStatus(int); - method public android.mtp.MtpObjectInfo.Builder setSequenceNumber(int); + method public android.mtp.MtpObjectInfo.Builder setSequenceNumber(long); method public android.mtp.MtpObjectInfo.Builder setStorageId(int); - method public android.mtp.MtpObjectInfo.Builder setThumbCompressedSize(int); + method public android.mtp.MtpObjectInfo.Builder setThumbCompressedSize(long); method public android.mtp.MtpObjectInfo.Builder setThumbFormat(int); - method public android.mtp.MtpObjectInfo.Builder setThumbPixHeight(int); - method public android.mtp.MtpObjectInfo.Builder setThumbPixWidth(int); + method public android.mtp.MtpObjectInfo.Builder setThumbPixHeight(long); + method public android.mtp.MtpObjectInfo.Builder setThumbPixWidth(long); } public final class MtpStorageInfo { diff --git a/api/test-current.txt b/api/test-current.txt index 37978055dd2d7..4ac50284607bd 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -23160,7 +23160,7 @@ package android.mtp { method public boolean importFile(int, android.os.ParcelFileDescriptor); method public boolean open(android.hardware.usb.UsbDeviceConnection); method public android.mtp.MtpEvent readEvent(android.os.CancellationSignal); - method public boolean sendObject(int, int, android.os.ParcelFileDescriptor); + method public boolean sendObject(int, long, android.os.ParcelFileDescriptor); method public android.mtp.MtpObjectInfo sendObjectInfo(android.mtp.MtpObjectInfo); } @@ -23191,23 +23191,31 @@ package android.mtp { method public final int getAssociationDesc(); method public final int getAssociationType(); method public final int getCompressedSize(); + method public final long getCompressedSizeLong(); method public final long getDateCreated(); method public final long getDateModified(); method public final int getFormat(); method public final int getImagePixDepth(); + method public final long getImagePixDepthLong(); method public final int getImagePixHeight(); + method public final long getImagePixHeightLong(); method public final int getImagePixWidth(); + method public final long getImagePixWidthLong(); method public final java.lang.String getKeywords(); method public final java.lang.String getName(); method public final int getObjectHandle(); method public final int getParent(); method public final int getProtectionStatus(); method public final int getSequenceNumber(); + method public final long getSequenceNumberLong(); method public final int getStorageId(); method public final int getThumbCompressedSize(); + method public final long getThumbCompressedSizeLong(); method public final int getThumbFormat(); method public final int getThumbPixHeight(); + method public final long getThumbPixHeightLong(); method public final int getThumbPixWidth(); + method public final long getThumbPixWidthLong(); } public static class MtpObjectInfo.Builder { @@ -23216,24 +23224,24 @@ package android.mtp { method public android.mtp.MtpObjectInfo build(); method public android.mtp.MtpObjectInfo.Builder setAssociationDesc(int); method public android.mtp.MtpObjectInfo.Builder setAssociationType(int); - method public android.mtp.MtpObjectInfo.Builder setCompressedSize(int); + method public android.mtp.MtpObjectInfo.Builder setCompressedSize(long); method public android.mtp.MtpObjectInfo.Builder setDateCreated(long); method public android.mtp.MtpObjectInfo.Builder setDateModified(long); method public android.mtp.MtpObjectInfo.Builder setFormat(int); - method public android.mtp.MtpObjectInfo.Builder setImagePixDepth(int); - method public android.mtp.MtpObjectInfo.Builder setImagePixHeight(int); - method public android.mtp.MtpObjectInfo.Builder setImagePixWidth(int); + method public android.mtp.MtpObjectInfo.Builder setImagePixDepth(long); + method public android.mtp.MtpObjectInfo.Builder setImagePixHeight(long); + method public android.mtp.MtpObjectInfo.Builder setImagePixWidth(long); method public android.mtp.MtpObjectInfo.Builder setKeywords(java.lang.String); method public android.mtp.MtpObjectInfo.Builder setName(java.lang.String); method public android.mtp.MtpObjectInfo.Builder setObjectHandle(int); method public android.mtp.MtpObjectInfo.Builder setParent(int); method public android.mtp.MtpObjectInfo.Builder setProtectionStatus(int); - method public android.mtp.MtpObjectInfo.Builder setSequenceNumber(int); + method public android.mtp.MtpObjectInfo.Builder setSequenceNumber(long); method public android.mtp.MtpObjectInfo.Builder setStorageId(int); - method public android.mtp.MtpObjectInfo.Builder setThumbCompressedSize(int); + method public android.mtp.MtpObjectInfo.Builder setThumbCompressedSize(long); method public android.mtp.MtpObjectInfo.Builder setThumbFormat(int); - method public android.mtp.MtpObjectInfo.Builder setThumbPixHeight(int); - method public android.mtp.MtpObjectInfo.Builder setThumbPixWidth(int); + method public android.mtp.MtpObjectInfo.Builder setThumbPixHeight(long); + method public android.mtp.MtpObjectInfo.Builder setThumbPixWidth(long); } public final class MtpStorageInfo { diff --git a/media/java/android/mtp/MtpDevice.java b/media/java/android/mtp/MtpDevice.java index 4379a99cbb000..6bf942fbfb77e 100644 --- a/media/java/android/mtp/MtpDevice.java +++ b/media/java/android/mtp/MtpDevice.java @@ -153,10 +153,11 @@ public final class MtpDevice { * * @param objectHandle handle of the object to read * @param objectSize the size of the object (this should match - * {@link MtpObjectInfo#getCompressedSize} + * {@link MtpObjectInfo#getCompressedSize}) * @return the object's data, or null if reading fails */ public byte[] getObject(int objectHandle, int objectSize) { + Preconditions.checkArgumentNonnegative(objectSize, "objectSize should not be negative"); return native_get_object(objectHandle, objectSize); } @@ -284,7 +285,7 @@ public final class MtpDevice { * @param descriptor file descriptor to read the data from. * @return true if the file transfer succeeds */ - public boolean sendObject(int objectHandle, int size, ParcelFileDescriptor descriptor) { + public boolean sendObject(int objectHandle, long size, ParcelFileDescriptor descriptor) { return native_send_object(objectHandle, size, descriptor.getFd()); } @@ -343,16 +344,16 @@ public final class MtpDevice { private native MtpStorageInfo native_get_storage_info(int storageId); private native int[] native_get_object_handles(int storageId, int format, int objectHandle); private native MtpObjectInfo native_get_object_info(int objectHandle); - private native byte[] native_get_object(int objectHandle, int objectSize); + private native byte[] native_get_object(int objectHandle, long objectSize); private native long native_get_partial_object( int objectHandle, long offset, long objectSize, byte[] buffer) throws IOException; private native byte[] native_get_thumbnail(int objectHandle); private native boolean native_delete_object(int objectHandle); - private native long native_get_parent(int objectHandle); - private native long native_get_storage_id(int objectHandle); + private native int native_get_parent(int objectHandle); + private native int native_get_storage_id(int objectHandle); private native boolean native_import_file(int objectHandle, String destPath); private native boolean native_import_file(int objectHandle, int fd); - private native boolean native_send_object(int objectHandle, int size, int fd); + private native boolean native_send_object(int objectHandle, long size, int fd); private native MtpObjectInfo native_send_object_info(MtpObjectInfo info); private native int native_submit_event_request(); private native MtpEvent native_reap_event_request(int handle); diff --git a/media/java/android/mtp/MtpObjectInfo.java b/media/java/android/mtp/MtpObjectInfo.java index 64aa99705b01f..02092b177fe03 100644 --- a/media/java/android/mtp/MtpObjectInfo.java +++ b/media/java/android/mtp/MtpObjectInfo.java @@ -16,6 +16,8 @@ package android.mtp; +import com.android.internal.util.Preconditions; + /** * This class encapsulates information about an object on an MTP device. * This corresponds to the ObjectInfo Dataset described in @@ -96,9 +98,19 @@ public final class MtpObjectInfo { * @return the object size */ public final int getCompressedSize() { + Preconditions.checkState(mCompressedSize >= 0); return mCompressedSize; } + /** + * Returns the size of the MTP object + * + * @return the object size + */ + public final long getCompressedSizeLong() { + return uint32ToLong(mCompressedSize); + } + /** * Returns the format code for the MTP object's thumbnail * Will be zero for objects with no thumbnail @@ -116,9 +128,20 @@ public final class MtpObjectInfo { * @return the thumbnail size */ public final int getThumbCompressedSize() { + Preconditions.checkState(mThumbCompressedSize >= 0); return mThumbCompressedSize; } + /** + * Returns the size of the MTP object's thumbnail + * Will be zero for objects with no thumbnail + * + * @return the thumbnail size + */ + public final long getThumbCompressedSizeLong() { + return uint32ToLong(mThumbCompressedSize); + } + /** * Returns the width of the MTP object's thumbnail in pixels * Will be zero for objects with no thumbnail @@ -126,9 +149,20 @@ public final class MtpObjectInfo { * @return the thumbnail width */ public final int getThumbPixWidth() { + Preconditions.checkState(mThumbPixWidth >= 0); return mThumbPixWidth; } + /** + * Returns the width of the MTP object's thumbnail in pixels + * Will be zero for objects with no thumbnail + * + * @return the thumbnail width + */ + public final long getThumbPixWidthLong() { + return uint32ToLong(mThumbPixWidth); + } + /** * Returns the height of the MTP object's thumbnail in pixels * Will be zero for objects with no thumbnail @@ -136,9 +170,20 @@ public final class MtpObjectInfo { * @return the thumbnail height */ public final int getThumbPixHeight() { + Preconditions.checkState(mThumbPixHeight >= 0); return mThumbPixHeight; } + /** + * Returns the height of the MTP object's thumbnail in pixels + * Will be zero for objects with no thumbnail + * + * @return the thumbnail height + */ + public final long getThumbPixHeightLong() { + return uint32ToLong(mThumbPixHeight); + } + /** * Returns the width of the MTP object in pixels * Will be zero for non-image objects @@ -146,9 +191,20 @@ public final class MtpObjectInfo { * @return the image width */ public final int getImagePixWidth() { + Preconditions.checkState(mImagePixWidth >= 0); return mImagePixWidth; } + /** + * Returns the width of the MTP object in pixels + * Will be zero for non-image objects + * + * @return the image width + */ + public final long getImagePixWidthLong() { + return uint32ToLong(mImagePixWidth); + } + /** * Returns the height of the MTP object in pixels * Will be zero for non-image objects @@ -156,9 +212,20 @@ public final class MtpObjectInfo { * @return the image height */ public final int getImagePixHeight() { + Preconditions.checkState(mImagePixHeight >= 0); return mImagePixHeight; } + /** + * Returns the height of the MTP object in pixels + * Will be zero for non-image objects + * + * @return the image height + */ + public final long getImagePixHeightLong() { + return uint32ToLong(mImagePixHeight); + } + /** * Returns the depth of the MTP object in bits per pixel * Will be zero for non-image objects @@ -166,9 +233,20 @@ public final class MtpObjectInfo { * @return the image depth */ public final int getImagePixDepth() { + Preconditions.checkState(mImagePixDepth >= 0); return mImagePixDepth; } + /** + * Returns the depth of the MTP object in bits per pixel + * Will be zero for non-image objects + * + * @return the image depth + */ + public final long getImagePixDepthLong() { + return uint32ToLong(mImagePixDepth); + } + /** * Returns the object handle for the object's parent * Will be zero for the root directory of a storage unit @@ -203,7 +281,7 @@ public final class MtpObjectInfo { return mAssociationDesc; } - /** + /** * Returns the sequence number for the MTP object * This field is typically not used for MTP devices, * but is sometimes used to define a sequence of photos @@ -212,9 +290,22 @@ public final class MtpObjectInfo { * @return the object's sequence number */ public final int getSequenceNumber() { + Preconditions.checkState(mSequenceNumber >= 0); return mSequenceNumber; } + /** + * Returns the sequence number for the MTP object + * This field is typically not used for MTP devices, + * but is sometimes used to define a sequence of photos + * on PTP cameras. + * + * @return the object's sequence number + */ + public final long getSequenceNumberLong() { + return uint32ToLong(mSequenceNumber); + } + /** * Returns the name of the MTP object * @@ -309,8 +400,8 @@ public final class MtpObjectInfo { return this; } - public Builder setCompressedSize(int value) { - mObjectInfo.mCompressedSize = value; + public Builder setCompressedSize(long value) { + mObjectInfo.mCompressedSize = longToUint32(value, "value"); return this; } @@ -329,18 +420,18 @@ public final class MtpObjectInfo { return this; } - public Builder setImagePixDepth(int value) { - mObjectInfo.mImagePixDepth = value; + public Builder setImagePixDepth(long value) { + mObjectInfo.mImagePixDepth = longToUint32(value, "value"); return this; } - public Builder setImagePixHeight(int value) { - mObjectInfo.mImagePixHeight = value; + public Builder setImagePixHeight(long value) { + mObjectInfo.mImagePixHeight = longToUint32(value, "value"); return this; } - public Builder setImagePixWidth(int value) { - mObjectInfo.mImagePixWidth = value; + public Builder setImagePixWidth(long value) { + mObjectInfo.mImagePixWidth = longToUint32(value, "value"); return this; } @@ -364,8 +455,8 @@ public final class MtpObjectInfo { return this; } - public Builder setSequenceNumber(int value) { - mObjectInfo.mSequenceNumber = value; + public Builder setSequenceNumber(long value) { + mObjectInfo.mSequenceNumber = longToUint32(value, "value"); return this; } @@ -374,8 +465,8 @@ public final class MtpObjectInfo { return this; } - public Builder setThumbCompressedSize(int value) { - mObjectInfo.mThumbCompressedSize = value; + public Builder setThumbCompressedSize(long value) { + mObjectInfo.mThumbCompressedSize = longToUint32(value, "value"); return this; } @@ -384,13 +475,13 @@ public final class MtpObjectInfo { return this; } - public Builder setThumbPixHeight(int value) { - mObjectInfo.mThumbPixHeight = value; + public Builder setThumbPixHeight(long value) { + mObjectInfo.mThumbPixHeight = longToUint32(value, "value"); return this; } - public Builder setThumbPixWidth(int value) { - mObjectInfo.mThumbPixWidth = value; + public Builder setThumbPixWidth(long value) { + mObjectInfo.mThumbPixWidth = longToUint32(value, "value"); return this; } @@ -407,4 +498,13 @@ public final class MtpObjectInfo { return result; } } + + private static long uint32ToLong(int value) { + return value < 0 ? 0x100000000L + value : value; + } + + private static int longToUint32(long value, String valueName) { + Preconditions.checkArgumentInRange(value, 0, 0xffffffffL, valueName); + return (int) value; + } } diff --git a/media/jni/android_mtp_MtpDevice.cpp b/media/jni/android_mtp_MtpDevice.cpp index 8b7a9264a30a5..dc5784374b8d7 100644 --- a/media/jni/android_mtp_MtpDevice.cpp +++ b/media/jni/android_mtp_MtpDevice.cpp @@ -26,6 +26,7 @@ #include #include +#include #include "jni.h" #include "JNIHelp.h" @@ -370,9 +371,26 @@ android_mtp_MtpDevice_get_object_info(JNIEnv *env, jobject thiz, jint objectID) return info; } +bool check_uint32_arg(JNIEnv *env, const char* name, jlong value, uint32_t* out) { + if (value < 0 || 0xffffffff < value) { + jniThrowException( + env, + "java/lang/IllegalArgumentException", + (std::string("argument must be a 32-bit unsigned integer: ") + name).c_str()); + return false; + } + *out = static_cast(value); + return true; +} + static jbyteArray -android_mtp_MtpDevice_get_object(JNIEnv *env, jobject thiz, jint objectID, jint objectSize) +android_mtp_MtpDevice_get_object(JNIEnv *env, jobject thiz, jint objectID, jlong objectSizeLong) { + uint32_t objectSize; + if (!check_uint32_arg(env, "objectSize", objectSizeLong, &objectSize)) { + return nullptr; + } + MtpDevice* device = get_device_from_object(env, thiz); if (!device) { return nullptr; @@ -396,8 +414,8 @@ static jlong android_mtp_MtpDevice_get_partial_object(JNIEnv *env, jobject thiz, jint objectID, - jlong offset, - jlong size, + jlong offsetLong, + jlong sizeLong, jbyteArray array) { if (!array) { @@ -405,19 +423,10 @@ android_mtp_MtpDevice_get_partial_object(JNIEnv *env, return -1; } - if (offset < 0 || 0xffffffffL < offset) { - jniThrowException( - env, - "java/lang/IllegalArgumentException", - "Offset argument must be a 32-bit unsigned integer."); - return -1; - } - - if (size < 0 || 0xffffffffL < size) { - jniThrowException( - env, - "java/lang/IllegalArgumentException", - "Size argument must be a 32-bit unsigned integer."); + uint32_t offset; + uint32_t size; + if (!check_uint32_arg(env, "offset", offsetLong, &offset) || + !check_uint32_arg(env, "size", sizeLong, &size)) { return -1; } @@ -467,22 +476,22 @@ android_mtp_MtpDevice_delete_object(JNIEnv *env, jobject thiz, jint object_id) } } -static jlong +static jint android_mtp_MtpDevice_get_parent(JNIEnv *env, jobject thiz, jint object_id) { MtpDevice* device = get_device_from_object(env, thiz); if (device) - return (jlong)device->getParent(object_id); + return static_cast(device->getParent(object_id)); else return -1; } -static jlong +static jint android_mtp_MtpDevice_get_storage_id(JNIEnv *env, jobject thiz, jint object_id) { MtpDevice* device = get_device_from_object(env, thiz); if (device) - return (jlong)device->getStorageID(object_id); + return static_cast(device->getStorageID(object_id)); else return -1; } @@ -516,8 +525,13 @@ android_mtp_MtpDevice_import_file_to_fd(JNIEnv *env, jobject thiz, jint object_i } static jboolean -android_mtp_MtpDevice_send_object(JNIEnv *env, jobject thiz, jint object_id, jint size, jint fd) +android_mtp_MtpDevice_send_object( + JNIEnv *env, jobject thiz, jint object_id, jlong sizeLong, jint fd) { + uint32_t size; + if (!check_uint32_arg(env, "size", sizeLong, &size)) + return JNI_FALSE; + MtpDevice* device = get_device_from_object(env, thiz); if (!device) return JNI_FALSE; @@ -647,16 +661,16 @@ static const JNINativeMethod gMethods[] = { (void *)android_mtp_MtpDevice_get_object_handles}, {"native_get_object_info", "(I)Landroid/mtp/MtpObjectInfo;", (void *)android_mtp_MtpDevice_get_object_info}, - {"native_get_object", "(II)[B",(void *)android_mtp_MtpDevice_get_object}, + {"native_get_object", "(IJ)[B",(void *)android_mtp_MtpDevice_get_object}, {"native_get_partial_object", "(IJJ[B)J", (void *)android_mtp_MtpDevice_get_partial_object}, {"native_get_thumbnail", "(I)[B",(void *)android_mtp_MtpDevice_get_thumbnail}, {"native_delete_object", "(I)Z", (void *)android_mtp_MtpDevice_delete_object}, - {"native_get_parent", "(I)J", (void *)android_mtp_MtpDevice_get_parent}, - {"native_get_storage_id", "(I)J", (void *)android_mtp_MtpDevice_get_storage_id}, + {"native_get_parent", "(I)I", (void *)android_mtp_MtpDevice_get_parent}, + {"native_get_storage_id", "(I)I", (void *)android_mtp_MtpDevice_get_storage_id}, {"native_import_file", "(ILjava/lang/String;)Z", (void *)android_mtp_MtpDevice_import_file}, {"native_import_file", "(II)Z",(void *)android_mtp_MtpDevice_import_file_to_fd}, - {"native_send_object", "(III)Z",(void *)android_mtp_MtpDevice_send_object}, + {"native_send_object", "(IJI)Z",(void *)android_mtp_MtpDevice_send_object}, {"native_send_object_info", "(Landroid/mtp/MtpObjectInfo;)Landroid/mtp/MtpObjectInfo;", (void *)android_mtp_MtpDevice_send_object_info}, {"native_submit_event_request", "()I", (void *)android_mtp_MtpDevice_submit_event_request},