diff options
author | Zhijun He <zhijunhe@google.com> | 2015-12-03 15:34:34 -0800 |
---|---|---|
committer | Zhijun He <zhijunhe@google.com> | 2015-12-07 14:38:37 -0800 |
commit | dc6bb24a3c2c830c909523e8d7d999fb556fb77d (patch) | |
tree | 7c7d69f6c1ebcebbd52ac37a16bf7a6899589f1b /media/jni/android_media_ImageReader.cpp | |
parent | 8d19ad443face8b862ac0a3cac095070a5ac9ad0 (diff) |
media: improve ImageReader/Writer native memory management
* Hook up the native allocation registration with ImageWriter, such that GC
can get some hint when clean up the large memory object.
* Close all pending images when closing ImageReader. This could avoid native
mem leaks for some bad app practice. For example, some apps may hold images
in background service when activity is paused/destroyed, which could cause
huge native memory leaks even ImageReader is closed.
* make Image close thread safe: it is possible the clients close the image
in listener thread and the client main thread.
* Some minor code refactor to reduce the code duplication.
Bug: 25088440
Change-Id: I37d22b52aeb8d2521bf9c702b0f54c05905473e0
Diffstat (limited to 'media/jni/android_media_ImageReader.cpp')
-rw-r--r-- | media/jni/android_media_ImageReader.cpp | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/media/jni/android_media_ImageReader.cpp b/media/jni/android_media_ImageReader.cpp index 3ffdb17f4ec0..9a53186365e1 100644 --- a/media/jni/android_media_ImageReader.cpp +++ b/media/jni/android_media_ImageReader.cpp @@ -933,7 +933,7 @@ static void ImageReader_imageRelease(JNIEnv* env, jobject thiz, jobject image) CpuConsumer* consumer = ctx->getCpuConsumer(); CpuConsumer::LockedBuffer* buffer = Image_getLockedBuffer(env, image); if (!buffer) { - ALOGW("Image already released!!!"); + // Release an already closed image is harmless. return; } consumer->unlockBuffer(*buffer); @@ -1078,7 +1078,8 @@ static jint ImageReader_imageSetup(JNIEnv* env, jobject thiz, jobject image) { ALOGV("%s:", __FUNCTION__); JNIImageReaderContext* ctx = ImageReader_getContext(env, thiz); if (ctx == NULL) { - jniThrowRuntimeException(env, "ImageReaderContext is not initialized"); + jniThrowException(env, "java/lang/IllegalStateException", + "ImageReader is not initialized or was already closed"); return -1; } |