diff options
| author | Mike Lockwood <lockwood@android.com> | 2010-09-27 10:01:00 -0400 |
|---|---|---|
| committer | Mike Lockwood <lockwood@android.com> | 2010-09-27 13:16:53 -0400 |
| commit | 8839471f4d83238f9c017142dcbe3f915f3213fb (patch) | |
| tree | f8f30d5fb07e3dbbad9954fdf844e71f7f1d03b7 /media/jni/android_media_MtpDatabase.cpp | |
| parent | ae078f7dacdc719d045c2d19bbce019599fec64e (diff) | |
| download | frameworks_base-8839471f4d83238f9c017142dcbe3f915f3213fb.zip frameworks_base-8839471f4d83238f9c017142dcbe3f915f3213fb.tar.gz frameworks_base-8839471f4d83238f9c017142dcbe3f915f3213fb.tar.bz2 | |
MTP: Fix local reference leaks.
We cannot rely on the VM automatically freeing local references for us
in a timely manner in JNI code that is not called directly from Java.
Change-Id: I6ee8a9a97cb557b9d3b2ace4e4d20467b436fb9c
Signed-off-by: Mike Lockwood <lockwood@android.com>
Diffstat (limited to 'media/jni/android_media_MtpDatabase.cpp')
| -rw-r--r-- | media/jni/android_media_MtpDatabase.cpp | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/media/jni/android_media_MtpDatabase.cpp b/media/jni/android_media_MtpDatabase.cpp index 10ad29d..d6bf609 100644 --- a/media/jni/android_media_MtpDatabase.cpp +++ b/media/jni/android_media_MtpDatabase.cpp @@ -207,10 +207,13 @@ MtpObjectHandle MyMtpDatabase::beginSendObject(const char* path, uint64_t size, time_t modified) { JNIEnv* env = AndroidRuntime::getJNIEnv(); + jstring pathStr = env->NewStringUTF(path); MtpObjectHandle result = env->CallIntMethod(mDatabase, method_beginSendObject, - env->NewStringUTF(path), (jint)format, (jint)parent, (jint)storage, + pathStr, (jint)format, (jint)parent, (jint)storage, (jlong)size, (jlong)modified); + if (pathStr) + env->DeleteLocalRef(pathStr); checkAndClearExceptionFromCallback(env, __FUNCTION__); return result; } @@ -218,9 +221,12 @@ MtpObjectHandle MyMtpDatabase::beginSendObject(const char* path, void MyMtpDatabase::endSendObject(const char* path, MtpObjectHandle handle, MtpObjectFormat format, bool succeeded) { JNIEnv* env = AndroidRuntime::getJNIEnv(); - env->CallVoidMethod(mDatabase, method_endSendObject, env->NewStringUTF(path), + jstring pathStr = env->NewStringUTF(path); + env->CallVoidMethod(mDatabase, method_endSendObject, pathStr, (jint)handle, (jint)format, (jboolean)succeeded); + if (pathStr) + env->DeleteLocalRef(pathStr); checkAndClearExceptionFromCallback(env, __FUNCTION__); } @@ -238,6 +244,7 @@ MtpObjectHandleList* MyMtpDatabase::getObjectList(MtpStorageID storageID, for (int i = 0; i < length; i++) list->push(handles[i]); env->ReleaseIntArrayElements(array, handles, 0); + env->DeleteLocalRef(array); checkAndClearExceptionFromCallback(env, __FUNCTION__); return list; @@ -266,6 +273,7 @@ MtpObjectFormatList* MyMtpDatabase::getSupportedPlaybackFormats() { for (int i = 0; i < length; i++) list->push(formats[i]); env->ReleaseIntArrayElements(array, formats, 0); + env->DeleteLocalRef(array); checkAndClearExceptionFromCallback(env, __FUNCTION__); return list; @@ -283,6 +291,7 @@ MtpObjectFormatList* MyMtpDatabase::getSupportedCaptureFormats() { for (int i = 0; i < length; i++) list->push(formats[i]); env->ReleaseIntArrayElements(array, formats, 0); + env->DeleteLocalRef(array); checkAndClearExceptionFromCallback(env, __FUNCTION__); return list; @@ -300,6 +309,7 @@ MtpObjectPropertyList* MyMtpDatabase::getSupportedObjectProperties(MtpObjectForm for (int i = 0; i < length; i++) list->push(properties[i]); env->ReleaseIntArrayElements(array, properties, 0); + env->DeleteLocalRef(array); checkAndClearExceptionFromCallback(env, __FUNCTION__); return list; @@ -317,6 +327,7 @@ MtpDevicePropertyList* MyMtpDatabase::getSupportedDeviceProperties() { for (int i = 0; i < length; i++) list->push(properties[i]); env->ReleaseIntArrayElements(array, properties, 0); + env->DeleteLocalRef(array); checkAndClearExceptionFromCallback(env, __FUNCTION__); return list; @@ -456,6 +467,8 @@ MtpResponseCode MyMtpDatabase::setObjectPropertyValue(MtpObjectHandle handle, jint result = env->CallIntMethod(mDatabase, method_setObjectProperty, (jint)handle, (jint)property, longValue, stringValue); + if (stringValue) + env->DeleteLocalRef(stringValue); checkAndClearExceptionFromCallback(env, __FUNCTION__); return result; @@ -577,6 +590,8 @@ MtpResponseCode MyMtpDatabase::setDevicePropertyValue(MtpDeviceProperty property jint result = env->CallIntMethod(mDatabase, method_setDeviceProperty, (jint)property, longValue, stringValue); + if (stringValue) + env->DeleteLocalRef(stringValue); checkAndClearExceptionFromCallback(env, __FUNCTION__); return result; @@ -741,6 +756,7 @@ MtpObjectHandleList* MyMtpDatabase::getObjectReferences(MtpObjectHandle handle) for (int i = 0; i < length; i++) list->push(handles[i]); env->ReleaseIntArrayElements(array, handles, 0); + env->DeleteLocalRef(array); checkAndClearExceptionFromCallback(env, __FUNCTION__); return list; @@ -761,6 +777,7 @@ MtpResponseCode MyMtpDatabase::setObjectReferences(MtpObjectHandle handle, env->ReleaseIntArrayElements(array, handles, 0); MtpResponseCode result = env->CallIntMethod(mDatabase, method_setObjectReferences, (jint)handle, array); + env->DeleteLocalRef(array); checkAndClearExceptionFromCallback(env, __FUNCTION__); return result; |
