標籤:object work 技術 over ota dir 技術分享 oid auto
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 Rapha?l 2.1.0(java)MediaScanner(java)MediaScanner(native)android_media_MediaScanner(native)android_media_MediaScanner(C++)MediaScanner(C++)MediaScannermedia_jniMyMediaScannerClient2. 初始化
在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 processDirectory MediaScanner *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原始碼具體解釋