summaryrefslogtreecommitdiffstats
path: root/media/jni
diff options
context:
space:
mode:
authorMike Lockwood <lockwood@android.com>2010-11-19 11:20:19 -0500
committerMike Lockwood <lockwood@android.com>2010-11-19 11:30:10 -0500
commit954c267725d64a37655d6f3a00de6a5aa00ddaf8 (patch)
tree9e3681b141c3bc3f6df5c93712bb56067baa06e3 /media/jni
parenta8bbc11afc0f93143c1fd200108a51c95507cc43 (diff)
downloadframeworks_base-954c267725d64a37655d6f3a00de6a5aa00ddaf8.zip
frameworks_base-954c267725d64a37655d6f3a00de6a5aa00ddaf8.tar.gz
frameworks_base-954c267725d64a37655d6f3a00de6a5aa00ddaf8.tar.bz2
PTP: Improve performance and reliability of file importing
Now the file copy is done completely within the media process rather than pushing data to the client via ContProvider.openFile(). File system writes are now interleaved with USB reads, which allows us to copy the data faster and prevents the camera from timing out during transfer. File is automatically inserted in the media provider after a successful import and a Uri is returned to the client. BUG: 2994234 Change-Id: Ie75c63da76f623343d3d966c6a707aa1ae871972 Signed-off-by: Mike Lockwood <lockwood@android.com>
Diffstat (limited to 'media/jni')
-rw-r--r--media/jni/android_media_MtpClient.cpp63
1 files changed, 10 insertions, 53 deletions
diff --git a/media/jni/android_media_MtpClient.cpp b/media/jni/android_media_MtpClient.cpp
index d23185b..6235fc0 100644
--- a/media/jni/android_media_MtpClient.cpp
+++ b/media/jni/android_media_MtpClient.cpp
@@ -39,19 +39,6 @@ static jmethodID method_deviceAdded;
static jmethodID method_deviceRemoved;
static jfieldID field_context;
-static struct file_descriptor_offsets_t
-{
- jclass mClass;
- jmethodID mConstructor;
- jfieldID mDescriptor;
-} gFileDescriptorOffsets;
-
-static struct parcel_file_descriptor_offsets_t
-{
- jclass mClass;
- jmethodID mConstructor;
-} gParcelFileDescriptorOffsets;
-
#ifdef HAVE_ANDROID_OS
static void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) {
@@ -201,34 +188,19 @@ android_media_MtpClient_get_storage_id(JNIEnv *env, jobject thiz,
return -1;
}
-static jobject
-android_media_MtpClient_open_file(JNIEnv *env, jobject thiz,
- jint device_id, jlong object_id)
+static jboolean
+android_media_MtpClient_import_file(JNIEnv *env, jobject thiz,
+ jint device_id, jlong object_id, jstring dest_path)
{
#ifdef HAVE_ANDROID_OS
MyClient *client = (MyClient *)env->GetIntField(thiz, field_context);
MtpDevice* device = client->getDevice(device_id);
- if (!device)
- return NULL;
-
- MtpObjectInfo* info = device->getObjectInfo(object_id);
- if (!info)
- return NULL;
- int object_size = info->mCompressedSize;
- delete info;
- int fd = device->readObject(object_id, object_size);
- if (fd < 0)
- return NULL;
-
- jobject fileDescriptor = env->NewObject(gFileDescriptorOffsets.mClass,
- gFileDescriptorOffsets.mConstructor);
- if (fileDescriptor != NULL) {
- env->SetIntField(fileDescriptor, gFileDescriptorOffsets.mDescriptor, fd);
- } else {
- return NULL;
+ if (device) {
+ const char *destPathStr = env->GetStringUTFChars(dest_path, NULL);
+ bool result = device->readObject(object_id, destPathStr);
+ env->ReleaseStringUTFChars(dest_path, destPathStr);
+ return result;
}
- return env->NewObject(gParcelFileDescriptorOffsets.mClass,
- gParcelFileDescriptorOffsets.mConstructor, fileDescriptor);
#endif
return NULL;
}
@@ -243,8 +215,8 @@ static JNINativeMethod gMethods[] = {
{"native_delete_object", "(IJ)Z", (void *)android_media_MtpClient_delete_object},
{"native_get_parent", "(IJ)J", (void *)android_media_MtpClient_get_parent},
{"native_get_storage_id", "(IJ)J", (void *)android_media_MtpClient_get_storage_id},
- {"native_open_file", "(IJ)Landroid/os/ParcelFileDescriptor;",
- (void *)android_media_MtpClient_open_file},
+ {"native_import_file", "(IJLjava/lang/String;)Z",
+ (void *)android_media_MtpClient_import_file},
};
static const char* const kClassPathName = "android/media/MtpClient";
@@ -276,21 +248,6 @@ int register_android_media_MtpClient(JNIEnv *env)
return -1;
}
- clazz = env->FindClass("java/io/FileDescriptor");
- LOG_FATAL_IF(clazz == NULL, "Unable to find class java.io.FileDescriptor");
- gFileDescriptorOffsets.mClass = (jclass) env->NewGlobalRef(clazz);
- gFileDescriptorOffsets.mConstructor = env->GetMethodID(clazz, "<init>", "()V");
- gFileDescriptorOffsets.mDescriptor = env->GetFieldID(clazz, "descriptor", "I");
- LOG_FATAL_IF(gFileDescriptorOffsets.mDescriptor == NULL,
- "Unable to find descriptor field in java.io.FileDescriptor");
-
- clazz = env->FindClass("android/os/ParcelFileDescriptor");
- LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.ParcelFileDescriptor");
- gParcelFileDescriptorOffsets.mClass = (jclass) env->NewGlobalRef(clazz);
- gParcelFileDescriptorOffsets.mConstructor = env->GetMethodID(clazz, "<init>", "(Ljava/io/FileDescriptor;)V");
- LOG_FATAL_IF(gParcelFileDescriptorOffsets.mConstructor == NULL,
- "Unable to find constructor for android.os.ParcelFileDescriptor");
-
return AndroidRuntime::registerNativeMethods(env,
"android/media/MtpClient", gMethods, NELEM(gMethods));
}