<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                我們知道,Java中創建的對象最后是由垃圾回收器來回收和釋放內存的,可它對JNI有什么影響呢?下面看一個例子: **垃圾回收例子** ~~~ static jobject save_thiz = NULL; //定義一個全局的jobject static void android_media_MediaScanner_processFile(JNIEnv*env, jobject thiz, jstring path, jstringmimeType, jobject client) { ...... //保存Java層傳入的jobject對象,代表MediaScanner對象 save_thiz = thiz; ...... return; } //假設在某個時間,有地方調用callMediaScanner函數 void callMediaScanner() { //在這個函數中操作save_thiz,會有問題嗎? } ~~~ 上面的做法肯定會有問題,因為和save_thiz對應的Java層中的MediaScanner很有可能已經被垃圾回收了,也就是說,save_thiz保存的這個jobject可能是一個野指針,如使用它,后果會很嚴重。 可能有人要問,將一個引用類型進行賦值操作,它的引用計數不會增加嗎?而垃圾回收機制只會保證那些沒有被引用的對象才會被清理。問得對,但如果在JNI層使用下面這樣的語句,是不會增加引用計數的。 ~~~ save_thiz = thiz; //這種賦值不會增加jobject的引用計數。 ~~~ 那該怎么辦?不必擔心,JNI規范已很好地解決了這一問題,JNI技術一共提供了三種類型的引用,它們分別是: - Local Reference:本地引用。在JNI層函數中使用的非全局引用對象都是Local Reference。它包括函數調用時傳入的jobject、在JNI層函數中創建的jobject。LocalReference最大的特點就是,一旦JNI層函數返回,這些jobject就可能被垃圾回收。 - Global Reference:全局引用,這種對象如不主動釋放,就永遠不會被垃圾回收。 - Weak Global Reference:弱全局引用,一種特殊的GlobalReference,在運行過程中可能會被垃圾回收。所以在程序中使用它之前,需要調用JNIEnv的IsSameObject判斷它是不是被回收了。 平時用得最多的是Local Reference和Global Reference,下面看一個實例,代碼如下所示: **android_media_MediaScanner.cpp::MyMediaScannerClient構造函數** ~~~ MyMediaScannerClient(JNIEnv *env, jobjectclient) : mEnv(env), //調用NewGlobalRef創建一個GlobalReference,這樣mClient就不用擔心被回收了。 mClient(env->NewGlobalRef(client)), mScanFileMethodID(0), mHandleStringTagMethodID(0), mSetMimeTypeMethodID(0) { ...... } //析構函數 virtual ~MyMediaScannerClient() { mEnv->DeleteGlobalRef(mClient);//調用DeleteGlobalRef釋放這個全局引用。 } ~~~ 每當JNI層想要保存Java層中的某個對象時,就可以使用Global Reference,使用完后記住釋放它就可以了。這一點很容易理解。下面要講有關LocalReference的一個問題,還是先看實例,代碼如下所示: **android_media_MediaScanner.cpp::MyMediaScannerClient的scanFile** ~~~ virtualbool scanFile(const char* path, long long lastModified, long long fileSize) { jstringpathStr; //調用NewStringUTF創建一個jstring對象,它是Local Reference類型。 if((pathStr = mEnv->NewStringUTF(path)) == NULL) return false; //調用Java的scanFile函數,把這個jstring傳進去 mEnv->CallVoidMethod(mClient, mScanFileMethodID, pathStr,lastModified, fileSize); /* 根據LocalReference的說明,這個函數返回后,pathStr對象就會被回收。所以 下面這個DeleteLocalRef調用看起來是多余的,其實不然,這里解釋一下原因: 1)如果不調用DeleteLocalRef,pathStr將在函數返回后被回收。 2)如果調用DeleteLocalRef的話,pathStr會立即被回收。這兩者看起來沒什么區別, 不過代碼要是像下面這樣的話,虛擬機的內存就會被很快被耗盡: for(inti = 0; i < 100; i++) { jstring pathStr = mEnv->NewStringUTF(path); ......//做一些操作 //mEnv->DeleteLocalRef(pathStr); //不立即釋放Local Reference } 如果在上面代碼的循環中不調用DeleteLocalRef的話,則會創建100個jstring, 那么內存的耗費就非常可觀了! */ mEnv->DeleteLocalRef(pathStr); return(!mEnv->ExceptionCheck()); } ~~~ 所以,沒有及時回收的Local Reference或許是進程占用過多的一個原因,請務必注意這一點。
                  <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>

                              哎呀哎呀视频在线观看