diff options
author | James Dong <jdong@google.com> | 2011-03-11 15:18:40 -0800 |
---|---|---|
committer | James Dong <jdong@google.com> | 2011-03-11 19:08:59 -0800 |
commit | 133cf8b92a07d5be8c64607b9644aa9cef169fb0 (patch) | |
tree | ca6d0ac089b1ae342cfa3d4538945557b1bf36b5 | |
parent | 718e64b17f72874996425b7ba9a187d473bc58f7 (diff) | |
download | frameworks_base-133cf8b92a07d5be8c64607b9644aa9cef169fb0.zip frameworks_base-133cf8b92a07d5be8c64607b9644aa9cef169fb0.tar.gz frameworks_base-133cf8b92a07d5be8c64607b9644aa9cef169fb0.tar.bz2 |
Add a release() method to MediaScanner
bug - 2586042
Change-Id: I08713ac75cbcaf01dff21a24cdefb6e2dacc92cb
-rw-r--r-- | media/java/android/media/MediaScanner.java | 11 | ||||
-rw-r--r-- | media/jni/android_media_MediaScanner.cpp | 63 |
2 files changed, 57 insertions, 17 deletions
diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java index 74d65d1..6b9f2fb 100644 --- a/media/java/android/media/MediaScanner.java +++ b/media/java/android/media/MediaScanner.java @@ -1585,6 +1585,17 @@ public class MediaScanner private static native final void native_init(); private native final void native_setup(); private native final void native_finalize(); + + /** + * Releases resouces associated with this MediaScanner object. + * It is considered good practice to call this method when + * one is done using the MediaScanner object. After this method + * is called, the MediaScanner object can no longer be used. + */ + public void release() { + native_finalize(); + } + @Override protected void finalize() { mContext.getContentResolver().releaseProvider(mMediaProvider); diff --git a/media/jni/android_media_MediaScanner.cpp b/media/jni/android_media_MediaScanner.cpp index 8bbb997..9d7bf2c 100644 --- a/media/jni/android_media_MediaScanner.cpp +++ b/media/jni/android_media_MediaScanner.cpp @@ -29,11 +29,6 @@ using namespace android; -struct fields_t { - jfieldID context; -}; -static fields_t fields; - static const char* const kClassMediaScannerClient = "android/media/MediaScannerClient"; @@ -46,6 +41,12 @@ static const char* const kRunTimeException = static const char* const kIllegalArgumentException = "java/lang/IllegalArgumentException"; +struct fields_t { + jfieldID context; +}; +static fields_t fields; +static Mutex sLock; + class MyMediaScannerClient : public MediaScannerClient { public: @@ -181,13 +182,29 @@ static bool ExceptionCheck(void* env) return ((JNIEnv *)env)->ExceptionCheck(); } +// Call this method with sLock hold +static MediaScanner *getNativeScanner_l(JNIEnv* env, jobject thiz) +{ + return (MediaScanner *) env->GetIntField(thiz, fields.context); +} + +// Call this method with sLock hold +static void setNativeScanner_l(JNIEnv* env, jobject thiz, MediaScanner *s) +{ + env->SetIntField(thiz, fields.context, (int)s); +} + static void android_media_MediaScanner_processDirectory( JNIEnv *env, jobject thiz, jstring path, jobject client) { LOGV("processDirectory"); - MediaScanner *mp = - (MediaScanner *)env->GetIntField(thiz, fields.context); + Mutex::Autolock l(sLock); + MediaScanner *mp = getNativeScanner_l(env, thiz); + if (mp == NULL) { + jniThrowException(env, kRunTimeException, "No scanner available"); + return; + } if (path == NULL) { jniThrowException(env, kIllegalArgumentException, NULL); @@ -211,8 +228,13 @@ android_media_MediaScanner_processFile( jstring mimeType, jobject client) { LOGV("processFile"); - MediaScanner *mp = - (MediaScanner *)env->GetIntField(thiz, fields.context); + + // Lock already hold by processDirectory + MediaScanner *mp = getNativeScanner_l(env, thiz); + if (mp == NULL) { + jniThrowException(env, kRunTimeException, "No scanner available"); + return; + } if (path == NULL) { jniThrowException(env, kIllegalArgumentException, NULL); @@ -246,8 +268,12 @@ android_media_MediaScanner_setLocale( JNIEnv *env, jobject thiz, jstring locale) { LOGV("setLocale"); - MediaScanner *mp = - (MediaScanner *)env->GetIntField(thiz, fields.context); + Mutex::Autolock l(sLock); + MediaScanner *mp = getNativeScanner_l(env, thiz); + if (mp == NULL) { + jniThrowException(env, kRunTimeException, "No scanner available"); + return; + } if (locale == NULL) { jniThrowException(env, kIllegalArgumentException, NULL); @@ -268,8 +294,12 @@ android_media_MediaScanner_extractAlbumArt( JNIEnv *env, jobject thiz, jobject fileDescriptor) { LOGV("extractAlbumArt"); - MediaScanner *mp = - (MediaScanner *)env->GetIntField(thiz, fields.context); + Mutex::Autolock l(sLock); + MediaScanner *mp = getNativeScanner_l(env, thiz); + if (mp == NULL) { + jniThrowException(env, kRunTimeException, "No scanner available"); + return NULL; + } if (fileDescriptor == NULL) { jniThrowException(env, kIllegalArgumentException, NULL); @@ -339,14 +369,13 @@ static void android_media_MediaScanner_native_finalize(JNIEnv *env, jobject thiz) { LOGV("native_finalize"); - MediaScanner *mp = - (MediaScanner *)env->GetIntField(thiz, fields.context); - + Mutex::Autolock l(sLock); + MediaScanner *mp = getNativeScanner_l(env, thiz); if (mp == 0) { return; } - delete mp; + setNativeScanner_l(env, thiz, 0); } static JNINativeMethod gMethods[] = { |