summaryrefslogtreecommitdiff
path: root/media/jni/android_media_ImageReader.cpp
diff options
context:
space:
mode:
authorZhijun He <zhijunhe@google.com>2015-12-03 15:34:34 -0800
committerZhijun He <zhijunhe@google.com>2015-12-07 14:38:37 -0800
commitdc6bb24a3c2c830c909523e8d7d999fb556fb77d (patch)
tree7c7d69f6c1ebcebbd52ac37a16bf7a6899589f1b /media/jni/android_media_ImageReader.cpp
parent8d19ad443face8b862ac0a3cac095070a5ac9ad0 (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.cpp5
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;
}