• Android MediaScannerJNI源代码具体解释


    1.简单介绍

    MediaScannerJNI的在MediaScanner中的地位可參考
    Android MediaScanner 总纲
    MediaScanner JNI文件名称:
    android_media_MediaScanner.cpp
    位置:
    frameworksasemediajniandroid_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_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 void
    android_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 void
    android_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 void
    android_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");
            }
  • 相关阅读:
    F2etest v2.0.0 正式发布 ,阿里巴巴开源测试方案
    Spring-Wind 1.1.1 发布,SSM 架构核心库
    通过nginx配置文件抵御攻击 | WooYun知识库
    阿里云X-Forwarded-For 发现tomcat记录的日志全部来自于SLB转发的IP地址,不能获取到请求的真实IP。
    openresty+lua在反向代理服务中的玩法 | WooYun知识库
    java~lambda表达式让查询更优雅
    java~日期与字符串的转化
    java~google样式检查和命名规范
    springboot~Mongodb的集成与使用
    springboot~JPA把ORM统一起来
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7371398.html
Copyright © 2020-2023  润新知