<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智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                前面提到過一個問題,即Java的引用類型除了少數幾個外,最終在JNI層都用jobject來表示對象的數據類型,那么該如何操作這個jobject呢? 從另外一個角度來解釋這個問題。一個Java對象是由什么組成的?當然是它的成員變量和成員函數了。那么,操作jobject的本質就應當是操作這些對象的成員變量和成員函數。所以應先來看與成員變量及成員函數有關的內容。 **(1)jfieldID 和jmethodID的介紹** 我們知道,成員變量和成員函數是由類定義的,它是類的屬性,所以在JNI規則中,用jfieldID 和jmethodID 來表示Java類的成員變量和成員函數,它們通過JNIEnv的下面兩個函數可以得到: ~~~ jfieldID GetFieldID(jclass clazz,const char*name, const char *sig); jmethodID GetMethodID(jclass clazz, const char*name,const char *sig); ~~~ 其中,jclass代表Java類,name表示成員函數或成員變量的名字,sig為這個函數和變量的簽名信息。如前所示,成員函數和成員變量都是類的信息,這兩個函數的第一個參數都是jclass。 MS中是怎么使用它們的呢?來看代碼,如下所示: **android_media_MediaScanner.cpp::MyMediaScannerClient構造函數** ~~~ MyMediaScannerClient(JNIEnv *env, jobjectclient)...... { //先找到android.media.MediaScannerClient類在JNI層中對應的jclass實例。 jclass mediaScannerClientInterface = env->FindClass("android/media/MediaScannerClient"); //取出MediaScannerClient類中函數scanFile的jMethodID。 mScanFileMethodID = env->GetMethodID( mediaScannerClientInterface, "scanFile", "(Ljava/lang/String;JJ)V"); //取出MediaScannerClient類中函數handleStringTag的jMethodID。 mHandleStringTagMethodID = env->GetMethodID( mediaScannerClientInterface,"handleStringTag", "(Ljava/lang/String;Ljava/lang/String;)V"); ...... } ~~~ 在上面代碼中,將scanFile和handleStringTag函數的jmethodID保存為MyMediaScannerClient的成員變量。為什么這里要把它們保存起來呢?這個問題涉及一個事關程序運行效率的知識點: · 如果每次操作jobject前都去查詢jmethoID或jfieldID的話將會影響程序運行的效率。所以我們在初始化的時候,就可以取出這些ID并保存起來以供后續使用。 取出jmethodID后,又該怎么用它呢? **(2)使用jfieldID和jmethodID** 下面再看一個例子,其代碼如下所示: ~~~ virtualbool scanFile(const char* path, long long lastModified, long long fileSize) { jstring pathStr; if((pathStr = mEnv->NewStringUTF(path)) == NULL) return false; /* 調用JNIEnv的CallVoidMethod函數,注意CallVoidMethod的參數: 第一個是代表MediaScannerClient的jobject對象, 第二個參數是函數scanFile的jmethodID,后面是Java中scanFile的參數。 */ mEnv->CallVoidMethod(mClient, mScanFileMethodID, pathStr, lastModified, fileSize); mEnv->DeleteLocalRef(pathStr); return (!mEnv->ExceptionCheck()); } ~~~ 明白了,通過JNIEnv輸出的CallVoidMethod,再把jobject、jMethodID和對應參數傳進去,JNI層就能夠調用Java對象的函數了! 實際上JNIEnv輸出了一系列類似CallVoidMethod的函數,形式如下: ~~~ NativeType Call<type>Method(JNIEnv *env,jobject obj,jmethodID methodID, ...)。 ~~~ 其中type是對應Java函數的返回值類型,例如CallIntMethod、CallVoidMethod等。 上面是針對非static函數的,如果想調用Java中的static函數,則用JNIEnv輸出的CallStatic<Type>Method系列函數。 現在,我們已了解了如何通過JNIEnv操作jobject的成員函數,那么怎么通過jfieldID操作jobject的成員變量呢?這里,直接給出整體解決方案,如下所示: ~~~ //獲得fieldID后,可調用Get<type>Field系列函數獲取jobject對應成員變量的值。 NativeType Get<type>Field(JNIEnv *env,jobject obj,jfieldID fieldID) //或者調用Set<type>Field系列函數來設置jobject對應成員變量的值。 void Set<type>Field(JNIEnv *env,jobject obj,jfieldID fieldID,NativeType value) //下面我們列出一些參加的Get/Set函數。 GetObjectField() SetObjectField() GetBooleanField() SetBooleanField() GetByteField() SetByteField() GetCharField() SetCharField() GetShortField() SetShortField() GetIntField() SetIntField() GetLongField() SetLongField() GetFloatField() SetFloatField() GetDoubleField() SetDoubleField() ~~~ 通過本節的介紹,相信讀者已了解jfieldID和jmethodID的作用,也知道如何通過JNIEnv的函數來操作jobject了。雖然jobject是透明的,但有了JNIEnv的幫助,還是能輕松操作jobject背后的實際對象了。
                  <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>

                              哎呀哎呀视频在线观看