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”);}
,别让别人徘徊的脚步踩碎你明天美好的梦想,