zoukankan      html  css  js  c++  java
  • 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");
            }
  • 相关阅读:
    Packet for query is too large (1986748 > 1048576). You can change this value on the server by 异常
    解决springdatajpa插入大量数据速度慢的问题
    thymeleaf onclick方法向js方法传递参数
    git的使用(扫盲)
    【错误总结】Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.
    SpringBoot集成Swagger(Swagger的使用),生成接口文档,方便前后端分离开发
    spring中后台接收参数总结
    PTA 03-树3 Tree Traversals Again (25分)
    PTA 03-树2 List Leaves (25分)
    PTA 03-树1 树的同构 (25分)
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7371398.html
Copyright © 2011-2022 走看看