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 MediaScannerJNI源码详解_第1张图片
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++)MediaScanner media_jni MyMediaScannerClient

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 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");        }

更多相关文章

  1. android时区的初始化
  2. (2) Android中Binder调用流程 --- Binder环境的初始化
  3. OpenGL,Android注意事项初始化顺序 NullPointer
  4. Android P WMS初始化过程
  5. Android Init Language(安卓初始化语言)
  6. android webkit 初始化流程
  7. Android Initialization Process ---- Android 初始化过程

随机推荐

  1. 如何将蓝牙鼠标或触控板连接到 iPad?
  2. ORACLE 回滚段详解
  3. 【机器学习实战】垃圾分类快速理解机器学
  4. Python爬取4000条猫眼评论,带你围观2021最
  5. Tomcat日常维护笔记 - 运维小结
  6. 【论文解读】UniLM:一种既能阅读又能自动
  7. 【MOS】如何利用RMAN可传输表空间迁移数
  8. Java SPI机制与Thread Context Classload
  9. 如何在 指定文件夹 快速打开 jupyter not
  10. MyBatis传入参数为list 数组 map