Android MediaScannerJNI源码详解

1.简介

MediaScannerJNI的在MediaScanner中的地位可参考 Android MediaScanner 总纲 MediaScanner JNI文件名: android_media_MediaScanner.cpp 位置: frameworks\base\media\jni\android_media_MediaScanner.cpp android_media_MediaScanner是JAVA层和server层沟通的一个桥梁

android_media_MediaScanner中有一个MyMediaScannerClient是一个调用JAVA层android/media/MediaScannerClient的入口是Native层想java层通信的桥梁。

Created with Raphal 2.1.0(java)MediaScanner(java)MediaScanner(native)android_media_MediaScanner(native)android_media_MediaScanner(C++)MediaScanner(C++)MediaScannermedia_jniMyMediaScannerClient

2. 初始化

在MediaScanner.java初始化中过程调用,其核心是创建了一个StagefrightMediaScanner

static {System.loadLibrary(“media_jni”);native_init();}public MediaScanner(Context c) {native_setup();……}

native_init 对应 android_media_MediaScanner_native_init native_setup对应android_media_MediaScanner_native_setup

static voidandroid_media_MediaScanner_native_setup(JNIEnv *env, jobject thiz){ALOGV(“native_setup”);MediaScanner *mp = new StagefrightMediaScanner;……env->SetLongField(thiz, fields.context, (jlong)mp);}3. android_media_MediaScanner_processDirectory

调用MediaScanner.cpp实现processDirectory完成工作 在MediaScanner.java中调用scanDirectories,详见Android MediaScanner源代码解析 第6节 其功能还是通过MediaScanner.cpp的processDirectory实现对

static voidandroid_media_MediaScanner_processDirectory(JNIEnv *env, jobject thiz, jstring path, jobject client){MediaScanner *mp = getNativeScanner_l(env, thiz);const char *pathStr = env->GetStringUTFChars(path, NULL);MyMediaScannerClient myClient(env, client);MediaScanResult result = mp->processDirectory(pathStr, myClient);env->ReleaseStringUTFChars(path, pathStr);}4. android_media_MediaScanner_processFile

调用StageFrightMediaScanner.cpp实现processFile完成工作

static voidandroid_media_MediaScanner_processFile(JNIEnv *env, jobject thiz, jstring path,jstring mimeType, jobject client){// Lock already hold by processDirectoryMediaScanner *mp = getNativeScanner_l(env, thiz);const char *pathStr = env->GetStringUTFChars(path, NULL);const char *mimeTypeStr =(mimeType ? env->GetStringUTFChars(mimeType, NULL) : NULL);……..MyMediaScannerClient myClient(env, client);MediaScanResult result = mp->processFile(pathStr, mimeTypeStr, myClient);}5. MyMediaScannerClient

引用android/media/MediaScannerClient中scanFile,handleStringTag, setMimeType三个接口

jclass mediaScannerClientInterface =env->FindClass(kClassMediaScannerClient);if (mediaScannerClientInterface == NULL) {ALOGE(“Class %s not found”, kClassMediaScannerClient);} else {mScanFileMethodID = env->GetMethodID(mediaScannerClientInterface,”scanFile”,”(Ljava/lang/String;JJZZ)V”);mHandleStringTagMethodID = env->GetMethodID(mediaScannerClientInterface,”handleStringTag”,”(Ljava/lang/String;Ljava/lang/String;)V”);mSetMimeTypeMethodID = env->GetMethodID(mediaScannerClientInterface,”setMimeType”,”(Ljava/lang/String;)V”);}

,别让别人徘徊的脚步踩碎你明天美好的梦想,

Android MediaScannerJNI源码详解

相关文章:

你感兴趣的文章:

标签云: