From c96a7294a4ec7f807dbe0fd82a2ba2d58008304b Mon Sep 17 00:00:00 2001 From: wfeng6 Date: Mon, 25 Jun 2012 18:48:49 +0800 Subject: [PATCH] To avoid the JNI memory leaks in video editor codes There is a protential memory leak in video editor JNI codes. When importing so many video clips, the number of local reference will exceed 512, which will cause the Dalvik virtual machine crash. The patch will free each local reference when it's no longer used to avoid memory leaks. Change-Id: Iecd986c83f05a1103641746d6d43eef0a9c5ee40 Author: Wei Feng Signed-off-by: Wei Feng Singed-off-by: Shuo Gao Signed-off-by: Bruce Beare Signed-off-by: Jack Ren Author-tracking-BZ: 40786 --- media/jni/mediaeditor/VideoEditorClasses.cpp | 9 +++++++++ media/jni/mediaeditor/VideoEditorJava.cpp | 3 +++ media/jni/mediaeditor/VideoEditorMain.cpp | 5 +++++ 3 files changed, 17 insertions(+) diff --git a/media/jni/mediaeditor/VideoEditorClasses.cpp b/media/jni/mediaeditor/VideoEditorClasses.cpp index 4e0e0f24cd755..4982a472571ba 100755 --- a/media/jni/mediaeditor/VideoEditorClasses.cpp +++ b/media/jni/mediaeditor/VideoEditorClasses.cpp @@ -1853,6 +1853,9 @@ videoEditClasses_getEditSettings( // Get the clip settings. videoEditClasses_getClipSettings(pResult, pEnv, clipSettings, &pSettings->pClipList[i]); + + // Free the local references to avoid memory leaks + pEnv->DeleteLocalRef(clipSettings); } } } @@ -1877,6 +1880,9 @@ videoEditClasses_getEditSettings( // Get the transition settings. videoEditClasses_getTransitionSettings(pResult, pEnv, transitionSettings, &pSettings->pTransitionList[i]); + + // Free the local references to avoid memory leaks + pEnv->DeleteLocalRef(transitionSettings); } } } @@ -1900,6 +1906,9 @@ videoEditClasses_getEditSettings( // Get the effect settings. videoEditClasses_getEffectSettings(pResult, pEnv, effectSettings, &pSettings->Effects[i]); + + // Free the local references to avoid memory leaks + pEnv->DeleteLocalRef(effectSettings); } } } diff --git a/media/jni/mediaeditor/VideoEditorJava.cpp b/media/jni/mediaeditor/VideoEditorJava.cpp index ec8050f63c386..bcf9099081ceb 100755 --- a/media/jni/mediaeditor/VideoEditorJava.cpp +++ b/media/jni/mediaeditor/VideoEditorJava.cpp @@ -387,6 +387,9 @@ videoEditJava_getString( (*pLength) = length; } } + + // Delete local references to avoid memory leaks + pEnv->DeleteLocalRef(string); } // Return the string. diff --git a/media/jni/mediaeditor/VideoEditorMain.cpp b/media/jni/mediaeditor/VideoEditorMain.cpp index 41ec12090e4c0..41c28c0d8630c 100755 --- a/media/jni/mediaeditor/VideoEditorMain.cpp +++ b/media/jni/mediaeditor/VideoEditorMain.cpp @@ -380,6 +380,9 @@ getClipSetting( pEnv->GetIntField(object,fid); M4OSA_TRACE1_1("videoRotation = %d", pSettings->ClipProperties.videoRotationDegrees); + + // Free the local references to avoid memory leaks + pEnv->DeleteLocalRef(clazz); } static void jniPreviewProgressCallback (void* cookie, M4OSA_UInt32 msgType, @@ -1849,7 +1852,9 @@ videoEditor_populateSettings( "not initialized"); if (needToBeLoaded) { getClipSetting(pEnv,properties, pContext->pEditSettings->pClipList[i]); + pEnv->DeleteLocalRef(properties); } else { + pEnv->DeleteLocalRef(properties); goto videoEditor_populateSettings_cleanup; } }