<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                現在分析MS的JNI層。在Java層中,有三個函數涉及JNI層,它們是: - native_init,這個函數由MediaScanner類的static塊調用。 - native_setup,這個函數由MediaScanner的構造函數調用。 - processDirectory,這個函數由MS掃描文件夾時調用。 分別來分析它們。 1. native_init函數的分析 下面是native_init對應的JNI函數,其代碼如下所示: **android_media_MediaScanner.cpp** ~~~ static void android_media_MediaScanner_native_init(JNIEnv*env) { jclass clazz; clazz =env->FindClass("android/media/MediaScanner"); //取得Java中MS類的mNativeContext信息。待會創建Native對象的指針會保存 //到JavaMS對象的mNativeContext變量中。 fields.context = env->GetFieldID(clazz,"mNativeContext", "I"); ...... } ~~~ native_init函數沒什么新意,這種把Native對象的指針保存到Java對象中的做法,已經屢見不鮮。下面看第二個函數native_setup。 2. native_setup函數的分析 native_setup對應的JNI函數如下所示: **android_media_MediaScanner.cpp** ~~~ android_media_MediaScanner_native_setup(JNIEnv*env, jobject thiz) { //創建Native層的MediaScanner對象 MediaScanner*mp = createMediaScanner(); ...... //把mp的指針保存到Java MS對象的mNativeContext中去 env->SetIntField(thiz,fields.context, (int)mp); } //下面的createMediaScanner這個函數將創建一個Native的MS對象 static MediaScanner *createMediaScanner() { #if BUILD_WITH_FULL_STAGEFRIGHT charvalue[PROPERTY_VALUE_MAX]; if(property_get("media.stagefright.enable-scan", value, NULL) && (!strcmp(value, "1") || !strcasecmp(value,"true"))) { return new StagefrightMediaScanner; //使用Stagefright的MS } #endif #ifndef NO_OPENCORE returnnew PVMediaScanner(); //使用Opencore的MS,我們會分析這個 #endif returnNULL; } ~~~ native_setup函數將創建一個Native層的MS對象,不過可惜的是,它使用的還是Opencore提供的PVMediaScanner,所以后面還不可避免地會和Opencore“正面交鋒”。 4. processDirectory函數的分析 看processDirectories函數,它對應的JNI函數代碼如下所示: **android_media_MediaScanner.cpp** ~~~ android_media_MediaScanner_processDirectory(JNIEnv*env, jobject thiz, jstring path, jstring extensions, jobject client) { /* 注意上面傳入的參數,path為目標文件夾的路徑,extensions為MS支持的媒體文件后綴名集合, client為Java中的MediaScannerClient對象。 */ MediaScanner *mp = (MediaScanner*)env->GetIntField(thiz, fields.context); constchar *pathStr = env->GetStringUTFChars(path, NULL); constchar *extensionsStr = env->GetStringUTFChars(extensions, NULL); ...... //構造一個Native層的MyMediaScannerClient,并使用Java那個Client對象做參數。 //這個Native層的Client簡稱為MyMSC。 MyMediaScannerClient myClient(env, client); //調用Native的MS掃描文件夾,并且把Native的MyMSC傳進去。 mp->processDirectory(pathStr,extensionsStr, myClient, ExceptionCheck, env); ...... env->ReleaseStringUTFChars(path, pathStr); env->ReleaseStringUTFChars(extensions,extensionsStr); ...... } ~~~ processDirectory函數本身倒不難,但又冒出了幾個我們之前沒有接觸過的類型,下面先來認識一下它們。 5. 到底有多少種對象? 圖10-1展示了MediaScanner所涉及的相關類和它們之間的關系: :-: ![](http://img.blog.csdn.net/20150802165330508?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 圖10-1 MS相關類示意圖 為了便于理解,便將Java和Native層的對象都畫于圖中。從上圖可知: - Java MS對象通過mNativeContext指向Native的MS對象。 - Native的MyMSC對象通過mClient保存Java層的MyMSC對象。 - Native的MS對象調用processDirectory函數的時候會使用Native的MyMSC對象。 - 另外,圖中Native MS類的processFile是一個虛函數,需要派生類來實現。 其中比較費解的是MyMSC對象。它們有什么用呢?這個問題真是一言難盡。下面通過processDirectory來探尋其中原因,這回得進入PVMediaScanner的領地了。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看