freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

android系統(tǒng)進程間通信binder機制在應用程序框架層的java接口源代碼-資料下載頁

2025-04-07 05:06本頁面
  

【正文】 60。 這里,我們就是要把JavaBBinderHolder里面的JavaBBinder類型Binder實體添加到Service Manager中去,以便使得這個HelloService有Client來請求服務時,由Binder驅動程序來喚醒這個Server線程,進而調用這個JavaBBinder類型Binder實體的onTransact函數(shù)來進一步處理,這個函數(shù)我們在后面會繼續(xù)介紹。 先來看一下JavaBBinderHolder::get函數(shù)的實現(xiàn):view plain1. classJavaBBinderHolder:publicRefBase2. {3. ......4. 5. JavaBBinderHolder(JNIEnv*env,jobjectobject)6. :mObject(object)7. {8. ......9. }10. 11. ......12. 13. spJavaBBinderget(JNIEnv*env)14. {15. AutoMutex_l(mLock)。16. spJavaBBinderb=()。17. if(b==NULL){18. b=newJavaBBinder(env,mObject)。19. mBinder=b。20. ......21. }22. 23. returnb。24. }25. 26. ......27. 28. jobjectmObject。29. wpJavaBBindermBinder。30. }。 這里是第一次調用get函數(shù),因此,會創(chuàng)建一個JavaBBinder對象,并且保存在mBinder成員變量中。注意,這里的mObject就是上面創(chuàng)建的HelloService對象了,這是一個Java對象。這個HelloService對象最終也會保存在JavaBBinder對象的成員變量mObject中。 回到android_os_Parcel_writeStrongBinder函數(shù)中,下面這個語句:view plain1. conststatus_terr=parcelwriteStrongBinder(ibinderForJavaObject(env,object))。 相當于是:view plain1. conststatus_terr=parcelwriteStrongBinder((JavaBBinderHodler*)())。 因此,這里的效果相當于是寫入了一個JavaBBinder類型的Binder實體到parcel中去。這與我們前面介紹的Binder機制的C++實現(xiàn)是一致的。 接著,最后它通過其成員變量mRemote來執(zhí)行進程間通信操作。前面我們在介紹如何獲取Service Manager遠程接口時提到,這里的mRemote成員變量實際上是一個BinderProxy對象,因此,:view plain1. finalclassBinderProxyimplementsIBinder{2. ......3. 4. publicnativebooleantransact(intcode,Parceldata,Parcelreply,5. intflags)throwsRemoteException。6. 7. ......8. } 這里的transact成員函數(shù)又是一個JNI方法,它定義在frameworks/base/core/jni/:view plain1. staticjbooleanandroid_os_BinderProxy_transact(JNIEnv*env,jobjectobj,2. jintcode,jobjectdataObj,3. jobjectreplyObj,jintflags)4. {5. ......6. 7. Parcel*data=parcelForJavaObject(env,dataObj)。8. if(data==NULL){9. returnJNI_FALSE。10. }11. Parcel*reply=parcelForJavaObject(env,replyObj)。12. if(reply==NULLamp。amp。replyObj!=NULL){13. returnJNI_FALSE。14. }15. 16. IBinder*target=(IBinder*)17. envGetIntField(obj,)。18. if(target==NULL){19. jniThrowException(env,java/lang/IllegalStateException,Binderhasbeenfinalized!)。20. returnJNI_FALSE。21. }22. 23. ......24. 25. status_terr=targettransact(code,*data,reply,flags)。26. 27. ......28. 29. if(err==NO_ERROR){30. returnJNI_TRUE。31. }elseif(err==UNKNOWN_TRANSACTION){32. returnJNI_FALSE。33. }34. 35. signalExceptionForError(env,obj,err)。36. returnJNI_FALSE。37. } 這里傳進來的參數(shù)dataObj和replyObj是一個Java接口實現(xiàn)的Parcel類,由于這里是JNI層,需要把它轉換為C++實現(xiàn)的Parcel類,它們就是通過我們前面說的parcelForJavaObject函數(shù)進行轉換的。 前面我們在分析如何獲取Service Manager遠程接口時,曾經(jīng)說到,在JNI層中,創(chuàng)建了一個BpBinder對象,它的句柄值為0,因此,這里通過下面語句得到這個BpBinder對象的IBinder接口:view plain1. IBinder*target=(IBinder*)2. envGetIntField(obj,)。 有了這個IBinder接口后,就和我們前面幾篇文章介紹Binder機制的C/C++實現(xiàn)一致了。 最后,通過BpBinder::transact函數(shù)進入到Binder驅動程序,然后Binder驅動程序喚醒Service Manager響應這個ADD_SERVICE_TRANSACTION請求:view plain1. status_terr=targettransact(code,*data,reply,flags)。 具體可以參考Android系統(tǒng)進程間通信(IPC)機制Binder中的Server啟動過程源代碼分析一文。需要注意的是,這里的data包含了一個JavaBBinderHolder類型的Binder實體對象,它就代表了我們上面創(chuàng)建的HelloService。Service Manager收到這個ADD_SERVICE_TRANSACTION請求時,就會把這個Binder實體納入到自己內部進行管理。 這樣,實現(xiàn)HelloService的Server的啟動過程就完成了。 四.Client獲取HelloService的Java遠程接口的過程 前面我們在學習Android系統(tǒng)硬件抽象層(HAL)時,在在Ubuntu上為Android系統(tǒng)內置Java應用程序測試Application Frameworks層的硬件服務這篇文章中,我們創(chuàng)建了一個應用程序,這個應用程序作為一個Client角色,借助Service Manager這個Java遠程接口來獲得HelloService的遠程接口,進而調用HelloService提供的服務。 我們看看它是如何借助Service Manager這個Java遠程接口來獲得HelloService的遠程接口的。在Hello這個Activity的onCreate函數(shù),:view plain1. publicclassHelloextendsActivityimplementsOnClickListener{2. ......3. 4. privateIHelloServicehelloService=null。5. 6. ......7. 8. @Override9. publicvoidonCreate(BundlesavedInstanceState){10. 11. helloService=(12. (hello))。13. }14. 15. ......16. } 前面我們說過,:view plain1. classServiceManagerProxyimplementsIServiceManager{2. publicServiceManagerProxy(IBinderremote){3. mRemote=remote。4. }5. 6. ......7. 8. publicIBindergetService(Stringname)throwsRemoteException{9. Parceldata=()。10. Parcelreply=()。11. ()。12. (name)。13. (GET_SERVICE_TRANSACTION,data,reply,0)。14. IBinderbinder=()。15. ()。16. ()。17. returnbinder。18. }19. 20. ......21. 22. privateIBindermRemote。23. } 。我們在前面已經(jīng)介紹過了,這里的mRemote實際上是一個BinderProxy對象,它的transact成員函數(shù)是一個JNI方法,實現(xiàn)在frameworks/base/core/jni/。 這個函數(shù)前面我們已經(jīng)看到了,這里就不再列出來了。不過,當這個函數(shù)從:view plain1. status_terr=targettransact(code,*data,reply,flags)。 這里的reply變量里面就包括了一個HelloService的引用了。注意,它是一個Parcel對象。 ,從下面語句返回:view plain1. (GET_SERVICE_TRANSACTION,data,reply,0)。 接著,就通過下面語句將這個HelloService的引用讀出來:view plain1. IBinderbinder=()。 :view plain1. publicfinalclassParcel{2. ......3. 4. /**5. *ReadanobjectfromtheparcelatthecurrentdataPosition().6. */7. publicfinalnativeIBinderreadStrongBinder()。8. 9. ......10. } 它也是一個JNI方法,實現(xiàn)在frameworks/base/core/jni/:view plain1. staticjobjectandroid_os_Parcel_readStrongBinder(JNIEnv*env,jobjectclazz)2. {3. Parcel*parcel=parcelForJavaObject(env,clazz)。4. if(parcel!=NULL){5. 160
點擊復制文檔內容
公司管理相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1