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

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                雖然Java層Binder系統是Native層Binder系統的一個Mirror,但這個Mirror終歸還需借助Native層Binder系統來開展工作,即Mirror和Native層Binder有著千絲萬縷的關系,一定要在Java層Binder正式工作之前建立這種關系。下面分析Java層Binder框架是如何初始化的。 在Android系統中,在Java初創時期,系統會提前注冊一些JNI函數,其中有一個函數專門負責搭建Java Binder和Native Binder交互關系,該函數是register\_android\_os\_Binder,代碼如下: **android_util_Binder.cpp-->register_android_os_Binder()** ``` int register_android_os_Binder(JNIEnv* env) { // 初始化Java Binder類和Native層的關系 if(int_register_android_os_Binder(env) < 0) return -1; // 初始化Java BinderInternal類和Native層的關系 if(int_register_android_os_BinderInternal(env) < 0) return -1; // 初始化Java BinderProxy類和Native層的關系 if(int_register_android_os_BinderProxy(env) < 0) return -1; ...... return0; } ``` 據上面的代碼可知,register\_android\_os\_Binder函數完成了Java Binder架構中最重要的3個類的初始化工作。 #### 1. Binder類的初始化 int\_register\_android\_os\_Binder函數完成了Binder類的初始化工作,代碼如下: **android_util_Binder.cpp-->int_register_android_os_Binder()** ``` static int int_register_android_os_Binder(JNIEnv*env) { jclassclazz; //kBinderPathName為Java層中Binder類的全路徑名,“android/os/Binder“ clazz =env->FindClass(kBinderPathName); /*gBinderOffSets是一個靜態類對象,它專門保存Binder類的一些在JNI層中使用的信息, 如成員函數execTranscat的methodID,Binder類中成員mObject的fildID */ gBinderOffsets.mClass = (jclass) env->NewGlobalRef(clazz); gBinderOffsets.mExecTransact =env->GetMethodID(clazz, "execTransact", "(IIII)Z"); gBinderOffsets.mObject =env->GetFieldID(clazz, "mObject", "I"); // 注冊Binder類中native函數的實現 returnAndroidRuntime::registerNativeMethods( env,kBinderPathName, gBinderMethods,NELEM(gBinderMethods)); } ``` 從上面代碼可知,gBinderOffsets對象保存了和Binder類相關的某些在JNI層中使用的信息。它們將用來在JNI層對Java層的Binder對象進行操作。execTransact()函數以及mObject成員的用途將在2.2.3節介紹。 * * * * * **建議** 如果讀者對JNI不是很清楚,可參閱卷I第2章“深入理解JNI”。 * * * * * #### 2. BinderInternal類的初始化 下一個初始化的類是BinderInternal,其代碼在int\_register\_android\_os\_BinderInternal函數中。 **android_util_Binder.cpp-->int_register_android_os_BinderInternal()** ``` static intint_register_android_os_BinderInternal(JNIEnv* env) { jclassclazz; // 根據BinderInternal的全路徑名找到代表該類的jclass對象。全路徑名為 //“com/android/internal/os/BinderInternal” clazz =env->FindClass(kBinderInternalPathName); //gBinderInternalOffsets也是一個靜態對象,用來保存BinderInternal類的一些信息 gBinderInternalOffsets.mClass = (jclass) env->NewGlobalRef(clazz); // 獲取forceBinderGc的methodID gBinderInternalOffsets.mForceGc = env->GetStaticMethodID(clazz, "forceBinderGc","()V"); // 注冊BinderInternal類中native函數的實現 returnAndroidRuntime::registerNativeMethods( env,kBinderInternalPathName, gBinderInternalMethods, NELEM(gBinderInternalMethods)); } ``` int\_register\_android\_os\_BinderInternal的工作內容和int\_register\_android\_os\_Binder的工作內容類似: - 獲取一些有用的methodID和fieldID。這表明JNI層一定會向上調用Java層的函數。 - 注冊相關類中native函數的實現。 #### 3. BinderProxy類的初始化 int\_register\_android\_os\_BinderProxy完成了BinderProxy類的初始化工作,代碼稍顯復雜,如下所示: **android_util_Binder.cpp-->int_register_android_os_BinderProxy()** ``` static intint_register_android_os_BinderProxy(JNIEnv* env) { jclassclazz; // **① gWeakReferenceOffsets用來和WeakReference類打交道** clazz =env->FindClass("java/lang/ref/WeakReference"); gWeakReferenceOffsets.mClass = (jclass) env->NewGlobalRef(clazz); // 獲取WeakReference類get函數的MethodID gWeakReferenceOffsets.mGet= env->GetMethodID(clazz, "get", "()Ljava/lang/Object;"); // **② gErrorOffsets用來和Error類打交道** clazz =env->FindClass("java/lang/Error"); gErrorOffsets.mClass = (jclass) env->NewGlobalRef(clazz); // **③ gBinderProxyOffsets用來和BinderProxy類打交道** clazz =env->FindClass(kBinderProxyPathName); gBinderProxyOffsets.mClass = (jclass) env->NewGlobalRef(clazz); gBinderProxyOffsets.mConstructor= env->GetMethodID(clazz,"<init>", "()V"); ......//獲取BinderProxy的一些信息 // **④ gClassOffsets用來和Class類打交道** clazz =env->FindClass("java/lang/Class"); gClassOffsets.mGetName =env->GetMethodID(clazz, "getName","()Ljava/lang/String;"); // 注冊BinderProxy native函數的實現 returnAndroidRuntime::registerNativeMethods(env, kBinderProxyPathName,gBinderProxyMethods, NELEM(gBinderProxyMethods)); } ``` 據上面代碼可知,int\_register\_android\_os\_BinderProxy函數除了初始化BinderProxy類外,還獲取了WeakReference類和Error類的一些信息。看來BinderProxy對象的生命周期會委托WeakReference來管理,難怪JNI層會獲取該類get函數的MethodID。 至此,Java Binder幾個重要成員的初始化已完成,同時在代碼中定義了幾個全局靜態對象,分別是gBinderOffsets、gBinderInternalOffsets和gBinderProxyOffsets。 框架的初始化其實就是提前獲取一些JNI層的使用信息,如類成員函數的MethodID,類成員變量的fieldID等。這項工作是必需的,因為它能節省每次使用時獲取這些信息的時間。當Binder調用頻繁時,這些時間累積起來還是不容小覷的。 另外,這個過程中所創建的幾個全局靜態對象為JNI層訪問Java層的對象提供了依據。而在每個初始化函數中所執行的registerNativeMethods()方法則為Java層訪問JNI層打通了道路。換句話說,Binder初始化的工作就是通過JNI建立起Native Binder與Java Binder之間互相通信的橋梁。 下面通過一個例子來分析Java Binder的工作流程。
                  <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>

                              哎呀哎呀视频在线观看