summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Dong <jdong@google.com>2011-03-11 15:18:40 -0800
committerJames Dong <jdong@google.com>2011-03-11 19:08:59 -0800
commit133cf8b92a07d5be8c64607b9644aa9cef169fb0 (patch)
treeca6d0ac089b1ae342cfa3d4538945557b1bf36b5
parent718e64b17f72874996425b7ba9a187d473bc58f7 (diff)
downloadframeworks_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.java11
-rw-r--r--media/jni/android_media_MediaScanner.cpp63
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[] = {