A little cleanup in MediaScanner JNI code
o mainly use the defined class name rather than repeat the string each time
to reduce the typo chance.
o format the code also
Change-Id: I131c98f11335ff524d01a6791baa1b8c11013abc
diff --git a/media/jni/android_media_MediaScanner.cpp b/media/jni/android_media_MediaScanner.cpp
index a5176fa..8bbb997 100644
--- a/media/jni/android_media_MediaScanner.cpp
+++ b/media/jni/android_media_MediaScanner.cpp
@@ -1,4 +1,4 @@
-/* //device/libs/media_jni/MediaScanner.cpp
+/*
**
** Copyright 2007, The Android Open Source Project
**
@@ -15,36 +15,36 @@
** limitations under the License.
*/
-#define LOG_TAG "MediaScanner"
-#include "utils/Log.h"
-
-#include <media/mediascanner.h>
-#include <stdio.h>
-#include <assert.h>
-#include <limits.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <cutils/properties.h>
+//#define LOG_NDEBUG 0
+#define LOG_TAG "MediaScannerJNI"
+#include <utils/Log.h>
#include <utils/threads.h>
+#include <media/mediascanner.h>
+#include <media/stagefright/StagefrightMediaScanner.h>
#include "jni.h"
#include "JNIHelp.h"
#include "android_runtime/AndroidRuntime.h"
-#include <media/stagefright/StagefrightMediaScanner.h>
-
-// ----------------------------------------------------------------------------
-
using namespace android;
-// ----------------------------------------------------------------------------
struct fields_t {
jfieldID context;
};
static fields_t fields;
-// ----------------------------------------------------------------------------
+static const char* const kClassMediaScannerClient =
+ "android/media/MediaScannerClient";
+
+static const char* const kClassMediaScanner =
+ "android/media/MediaScanner";
+
+static const char* const kRunTimeException =
+ "java/lang/RuntimeException";
+
+static const char* const kIllegalArgumentException =
+ "java/lang/IllegalArgumentException";
class MyMediaScannerClient : public MediaScannerClient
{
@@ -56,33 +56,53 @@
mHandleStringTagMethodID(0),
mSetMimeTypeMethodID(0)
{
- jclass mediaScannerClientInterface = env->FindClass("android/media/MediaScannerClient");
+ LOGV("MyMediaScannerClient constructor");
+ jclass mediaScannerClientInterface =
+ env->FindClass(kClassMediaScannerClient);
+
if (mediaScannerClientInterface == NULL) {
- fprintf(stderr, "android/media/MediaScannerClient not found\n");
- }
- else {
- mScanFileMethodID = env->GetMethodID(mediaScannerClientInterface, "scanFile",
- "(Ljava/lang/String;JJZ)V");
- mHandleStringTagMethodID = env->GetMethodID(mediaScannerClientInterface, "handleStringTag",
- "(Ljava/lang/String;Ljava/lang/String;)V");
- mSetMimeTypeMethodID = env->GetMethodID(mediaScannerClientInterface, "setMimeType",
- "(Ljava/lang/String;)V");
- mAddNoMediaFolderMethodID = env->GetMethodID(mediaScannerClientInterface, "addNoMediaFolder",
- "(Ljava/lang/String;)V");
+ LOGE("Class %s not found", kClassMediaScannerClient);
+ } else {
+ mScanFileMethodID = env->GetMethodID(
+ mediaScannerClientInterface,
+ "scanFile",
+ "(Ljava/lang/String;JJZ)V");
+
+ mHandleStringTagMethodID = env->GetMethodID(
+ mediaScannerClientInterface,
+ "handleStringTag",
+ "(Ljava/lang/String;Ljava/lang/String;)V");
+
+ mSetMimeTypeMethodID = env->GetMethodID(
+ mediaScannerClientInterface,
+ "setMimeType",
+ "(Ljava/lang/String;)V");
+
+ mAddNoMediaFolderMethodID = env->GetMethodID(
+ mediaScannerClientInterface,
+ "addNoMediaFolder",
+ "(Ljava/lang/String;)V");
}
}
-
+
virtual ~MyMediaScannerClient()
{
+ LOGV("MyMediaScannerClient destructor");
mEnv->DeleteGlobalRef(mClient);
}
-
- // returns true if it succeeded, false if an exception occured in the Java code
+
+ // Returns true if it succeeded, false if an exception occured
+ // in the Java code
virtual bool scanFile(const char* path, long long lastModified,
long long fileSize, bool isDirectory)
{
+ LOGV("scanFile: path(%s), time(%lld), size(%lld) and isDir(%d)",
+ path, lastModified, fileSize, isDirectory);
+
jstring pathStr;
- if ((pathStr = mEnv->NewStringUTF(path)) == NULL) return false;
+ if ((pathStr = mEnv->NewStringUTF(path)) == NULL) {
+ return false;
+ }
mEnv->CallVoidMethod(mClient, mScanFileMethodID, pathStr, lastModified,
fileSize, isDirectory);
@@ -91,25 +111,36 @@
return (!mEnv->ExceptionCheck());
}
- // returns true if it succeeded, false if an exception occured in the Java code
+ // Returns true if it succeeded, false if an exception occured
+ // in the Java code
virtual bool handleStringTag(const char* name, const char* value)
{
+ LOGV("handleStringTag: name(%s) and value(%s)", name, value);
jstring nameStr, valueStr;
- if ((nameStr = mEnv->NewStringUTF(name)) == NULL) return false;
- if ((valueStr = mEnv->NewStringUTF(value)) == NULL) return false;
+ if ((nameStr = mEnv->NewStringUTF(name)) == NULL) {
+ return false;
+ }
+ if ((valueStr = mEnv->NewStringUTF(value)) == NULL) {
+ return false;
+ }
- mEnv->CallVoidMethod(mClient, mHandleStringTagMethodID, nameStr, valueStr);
+ mEnv->CallVoidMethod(
+ mClient, mHandleStringTagMethodID, nameStr, valueStr);
mEnv->DeleteLocalRef(nameStr);
mEnv->DeleteLocalRef(valueStr);
return (!mEnv->ExceptionCheck());
}
- // returns true if it succeeded, false if an exception occured in the Java code
+ // Returns true if it succeeded, false if an exception occured
+ // in the Java code
virtual bool setMimeType(const char* mimeType)
{
+ LOGV("setMimeType: %s", mimeType);
jstring mimeTypeStr;
- if ((mimeTypeStr = mEnv->NewStringUTF(mimeType)) == NULL) return false;
+ if ((mimeTypeStr = mEnv->NewStringUTF(mimeType)) == NULL) {
+ return false;
+ }
mEnv->CallVoidMethod(mClient, mSetMimeTypeMethodID, mimeTypeStr);
@@ -117,11 +148,15 @@
return (!mEnv->ExceptionCheck());
}
- // returns true if it succeeded, false if an exception occured in the Java code
+ // Returns true if it succeeded, false if an exception occured
+ // in the Java code
virtual bool addNoMediaFolder(const char* path)
{
+ LOGV("addNoMediaFolder: path(%s)", path);
jstring pathStr;
- if ((pathStr = mEnv->NewStringUTF(path)) == NULL) return false;
+ if ((pathStr = mEnv->NewStringUTF(path)) == NULL) {
+ return false;
+ }
mEnv->CallVoidMethod(mClient, mAddNoMediaFolderMethodID, pathStr);
@@ -133,33 +168,35 @@
private:
JNIEnv *mEnv;
jobject mClient;
- jmethodID mScanFileMethodID;
- jmethodID mHandleStringTagMethodID;
+ jmethodID mScanFileMethodID;
+ jmethodID mHandleStringTagMethodID;
jmethodID mSetMimeTypeMethodID;
jmethodID mAddNoMediaFolderMethodID;
};
-// ----------------------------------------------------------------------------
-
static bool ExceptionCheck(void* env)
{
+ LOGV("ExceptionCheck");
return ((JNIEnv *)env)->ExceptionCheck();
}
static void
-android_media_MediaScanner_processDirectory(JNIEnv *env, jobject thiz, jstring path, jobject client)
+android_media_MediaScanner_processDirectory(
+ JNIEnv *env, jobject thiz, jstring path, jobject client)
{
- MediaScanner *mp = (MediaScanner *)env->GetIntField(thiz, fields.context);
+ LOGV("processDirectory");
+ MediaScanner *mp =
+ (MediaScanner *)env->GetIntField(thiz, fields.context);
if (path == NULL) {
- jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
+ jniThrowException(env, kIllegalArgumentException, NULL);
return;
}
const char *pathStr = env->GetStringUTFChars(path, NULL);
if (pathStr == NULL) { // Out of memory
- jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
+ jniThrowException(env, kRunTimeException, "Out of memory");
return;
}
@@ -169,24 +206,30 @@
}
static void
-android_media_MediaScanner_processFile(JNIEnv *env, jobject thiz, jstring path, jstring mimeType, jobject client)
+android_media_MediaScanner_processFile(
+ JNIEnv *env, jobject thiz, jstring path,
+ jstring mimeType, jobject client)
{
- MediaScanner *mp = (MediaScanner *)env->GetIntField(thiz, fields.context);
+ LOGV("processFile");
+ MediaScanner *mp =
+ (MediaScanner *)env->GetIntField(thiz, fields.context);
if (path == NULL) {
- jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
+ jniThrowException(env, kIllegalArgumentException, NULL);
return;
}
-
+
const char *pathStr = env->GetStringUTFChars(path, NULL);
if (pathStr == NULL) { // Out of memory
- jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
+ jniThrowException(env, kRunTimeException, "Out of memory");
return;
}
- const char *mimeTypeStr = (mimeType ? env->GetStringUTFChars(mimeType, NULL) : NULL);
+
+ const char *mimeTypeStr =
+ (mimeType ? env->GetStringUTFChars(mimeType, NULL) : NULL);
if (mimeType && mimeTypeStr == NULL) { // Out of memory
env->ReleaseStringUTFChars(path, pathStr);
- jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
+ jniThrowException(env, kRunTimeException, "Out of memory");
return;
}
@@ -199,17 +242,20 @@
}
static void
-android_media_MediaScanner_setLocale(JNIEnv *env, jobject thiz, jstring locale)
+android_media_MediaScanner_setLocale(
+ JNIEnv *env, jobject thiz, jstring locale)
{
- MediaScanner *mp = (MediaScanner *)env->GetIntField(thiz, fields.context);
+ LOGV("setLocale");
+ MediaScanner *mp =
+ (MediaScanner *)env->GetIntField(thiz, fields.context);
if (locale == NULL) {
- jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
+ jniThrowException(env, kIllegalArgumentException, NULL);
return;
}
const char *localeStr = env->GetStringUTFChars(locale, NULL);
if (localeStr == NULL) { // Out of memory
- jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
+ jniThrowException(env, kRunTimeException, "Out of memory");
return;
}
mp->setLocale(localeStr);
@@ -218,12 +264,15 @@
}
static jbyteArray
-android_media_MediaScanner_extractAlbumArt(JNIEnv *env, jobject thiz, jobject fileDescriptor)
+android_media_MediaScanner_extractAlbumArt(
+ JNIEnv *env, jobject thiz, jobject fileDescriptor)
{
- MediaScanner *mp = (MediaScanner *)env->GetIntField(thiz, fields.context);
+ LOGV("extractAlbumArt");
+ MediaScanner *mp =
+ (MediaScanner *)env->GetIntField(thiz, fields.context);
if (fileDescriptor == NULL) {
- jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
+ jniThrowException(env, kIllegalArgumentException, NULL);
return NULL;
}
@@ -233,14 +282,14 @@
return NULL;
}
long len = *((long*)data);
-
+
jbyteArray array = env->NewByteArray(len);
if (array != NULL) {
jbyte* bytes = env->GetByteArrayElements(array, NULL);
memcpy(bytes, data + 4, len);
env->ReleaseByteArrayElements(array, bytes, 0);
}
-
+
done:
free(data);
// if NewByteArray() returned NULL, an out-of-memory
@@ -256,17 +305,18 @@
static void
android_media_MediaScanner_native_init(JNIEnv *env)
{
- jclass clazz;
-
- clazz = env->FindClass("android/media/MediaScanner");
+ LOGV("native_init");
+ jclass clazz = env->FindClass(kClassMediaScanner);
if (clazz == NULL) {
- jniThrowException(env, "java/lang/RuntimeException", "Can't find android/media/MediaScanner");
+ const char* err = "Can't find android/media/MediaScanner";
+ jniThrowException(env, kRunTimeException, err);
return;
}
fields.context = env->GetFieldID(clazz, "mNativeContext", "I");
if (fields.context == NULL) {
- jniThrowException(env, "java/lang/RuntimeException", "Can't find MediaScanner.mNativeContext");
+ const char* err = "Can't find MediaScanner.mNativeContext";
+ jniThrowException(env, kRunTimeException, err);
return;
}
}
@@ -274,10 +324,11 @@
static void
android_media_MediaScanner_native_setup(JNIEnv *env, jobject thiz)
{
+ LOGV("native_setup");
MediaScanner *mp = new StagefrightMediaScanner;
if (mp == NULL) {
- jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
+ jniThrowException(env, kRunTimeException, "Out of memory");
return;
}
@@ -287,38 +338,67 @@
static void
android_media_MediaScanner_native_finalize(JNIEnv *env, jobject thiz)
{
- MediaScanner *mp = (MediaScanner *)env->GetIntField(thiz, fields.context);
+ LOGV("native_finalize");
+ MediaScanner *mp =
+ (MediaScanner *)env->GetIntField(thiz, fields.context);
- //printf("##### android_media_MediaScanner_native_finalize: ctx=0x%p\n", ctx);
-
- if (mp == 0)
+ if (mp == 0) {
return;
+ }
delete mp;
}
-// ----------------------------------------------------------------------------
-
static JNINativeMethod gMethods[] = {
- {"processDirectory", "(Ljava/lang/String;Landroid/media/MediaScannerClient;)V",
- (void *)android_media_MediaScanner_processDirectory},
- {"processFile", "(Ljava/lang/String;Ljava/lang/String;Landroid/media/MediaScannerClient;)V",
- (void *)android_media_MediaScanner_processFile},
- {"setLocale", "(Ljava/lang/String;)V", (void *)android_media_MediaScanner_setLocale},
- {"extractAlbumArt", "(Ljava/io/FileDescriptor;)[B", (void *)android_media_MediaScanner_extractAlbumArt},
- {"native_init", "()V", (void *)android_media_MediaScanner_native_init},
- {"native_setup", "()V", (void *)android_media_MediaScanner_native_setup},
- {"native_finalize", "()V", (void *)android_media_MediaScanner_native_finalize},
-};
+ {
+ "processDirectory",
+ "(Ljava/lang/String;Landroid/media/MediaScannerClient;)V",
+ (void *)android_media_MediaScanner_processDirectory
+ },
-static const char* const kClassPathName = "android/media/MediaScanner";
+ {
+ "processFile",
+ "(Ljava/lang/String;Ljava/lang/String;Landroid/media/MediaScannerClient;)V",
+ (void *)android_media_MediaScanner_processFile
+ },
+
+ {
+ "setLocale",
+ "(Ljava/lang/String;)V",
+ (void *)android_media_MediaScanner_setLocale
+ },
+
+ {
+ "extractAlbumArt",
+ "(Ljava/io/FileDescriptor;)[B",
+ (void *)android_media_MediaScanner_extractAlbumArt
+ },
+
+ {
+ "native_init",
+ "()V",
+ (void *)android_media_MediaScanner_native_init
+ },
+
+ {
+ "native_setup",
+ "()V",
+ (void *)android_media_MediaScanner_native_setup
+ },
+
+ {
+ "native_finalize",
+ "()V",
+ (void *)android_media_MediaScanner_native_finalize
+ },
+};
// This function only registers the native methods, and is called from
// JNI_OnLoad in android_media_MediaPlayer.cpp
int register_android_media_MediaScanner(JNIEnv *env)
{
return AndroidRuntime::registerNativeMethods(env,
- "android/media/MediaScanner", gMethods, NELEM(gMethods));
+ kClassMediaScanner, gMethods, NELEM(gMethods));
}