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

正文內(nèi)容

android系統(tǒng)進程間通信binder機制在應(yīng)用程序框架層的java接口源代碼(已修改)

2025-04-19 05:06 本頁面
 

【正文】 在前面幾篇文章中,我們詳細介紹了Android系統(tǒng)進程間通信機制Binder的原理,并且深入分析了系統(tǒng)提供的Binder運行庫和驅(qū)動程序的源代碼。細心的讀者會發(fā)現(xiàn),這幾篇文章分析的Binder接口都是基于C/C++語言來實現(xiàn)的,但是我們在編寫應(yīng)用程序都是基于Java語言的,那么,我們?nèi)绾问褂肑ava語言來使用系統(tǒng)的Binder機制來進行進程間通信呢?這就是本文要介紹的Android系統(tǒng)應(yīng)用程序框架層的用Java語言來實現(xiàn)的Binder接口了。 熟悉Android系統(tǒng)的讀者,應(yīng)該能想到應(yīng)用程序框架中的基于Java語言的Binder接口是通過JNI來調(diào)用基于C/C++語言的Binder運行庫來為Java應(yīng)用程序提供進程間通信服務(wù)的了。JNI在Android系統(tǒng)中用得相當普遍,SDK中的Java接口API很多只是簡單地通過JNI來調(diào)用底層的C/C++運行庫從而為應(yīng)用程序服務(wù)的。 這里,我們?nèi)匀皇峭ㄟ^具體的例子來說明Binder機制在應(yīng)用程序框架層中的Java接口,主要就是Service Manager、Server和Client這三個角色的實現(xiàn)了。通常,在應(yīng)用程序中,我們都是把Server實現(xiàn)為Service的形式, Manager,接著就可以使用這個Service提供的功能了,這個與運行時庫的Binder接口是一致的。 前面我們學習Android硬件抽象層時,曾經(jīng)在應(yīng)用程序框架層中提供了一個硬件訪問服務(wù)HelloService,這個Service運行在一個獨立的進程中充當Server的角色,使用這個Service的Client運行在另一個進程中,它們之間就是通過Binder機制來通信的了。這里,我們就使用HelloService這個例子來分析Android系統(tǒng)進程間通信Binder機制在應(yīng)用程序框架層的Java接口源代碼。所以希望讀者在閱讀下面的內(nèi)容之前,先了解一下前面在Ubuntu上為Android系統(tǒng)的Application Frameworks層增加硬件訪問服務(wù)這篇文章。 這篇文章通過五個情景來學習Android系統(tǒng)進程間通信Binder機制在應(yīng)用程序框架層的Java接口:1. 獲取Service Manager的Java遠程接口的過程;2. HelloService接口的定義;3. HelloService的啟動過程;4. Client獲取HelloService的Java遠程接口的過程;5.Client通過HelloService的Java遠程接口來使用HelloService提供的服務(wù)的過程。 一. 獲取Service Manager的Java遠程接口 我們要獲取的Service Manager的Java遠程接口是一個ServiceManagerProxy對象的IServiceManager接口。我們現(xiàn)在就來看看ServiceManagerProxy類是長什么樣子的: 這里可以看出,ServiceManagerProxy類實現(xiàn)了IServiceManager接口,IServiceManager提供了getService和addService兩個成員函數(shù)來管理系統(tǒng)中的Service。從ServiceManagerProxy類的構(gòu)造函數(shù)可以看出,它需要一個BinderProxy對象的IBinder接口來作為參數(shù)。因此,要獲取Service Manager的Java遠程接口ServiceManagerProxy,首先要有一個BinderProxy對象。下面將會看到這個BinderProxy對象是如何獲得的。 再來看一下是通過什么路徑來獲取Service Manager的Java遠程接口ServiceManagerProxy的。這個主角就是ServiceManager了,我們也先看一下ServiceManager是長什么樣子的: ServiceManager類有一個靜態(tài)成員函數(shù)getIServiceManager,它的作用就是用來獲取Service Manager的Java遠程接口了,而這個函數(shù)又是通過ServiceManagerNative來獲取Service Manager的Java遠程接口的。 接下來,這個函數(shù)定義在frameworks/base/core/java/android/os/:view plain1. publicfinalclassServiceManager{2. ......3. privatestaticIServiceManagersServiceManager。4. ......5. privatestaticIServiceManagergetIServiceManager(){6. if(sServiceManager!=null){7. returnsServiceManager。8. }9. 10. //Findtheservicemanager11. sServiceManager=(())。12. returnsServiceManager。13. }14. ......15. } 如果其靜態(tài)成員變量sServiceManager尚未創(chuàng)建。 ,這個函數(shù)定義在frameworks/base/core/java//android/internal/os/:view plain1. publicclassBinderInternal{2. ......3. /**4. *Returntheglobalcontextobjectofthesystem.Thisisusually5. *animplementationofIServiceManager,whichyoucanusetofind6. *otherservices.7. */8. publicstaticfinalnativeIBindergetContextObject()。9. 10. ......11. } 這里可以看出,它實現(xiàn)在frameworks/base/core/jni/:view plain1. staticjobjectandroid_os_BinderInternal_getContextObject(JNIEnv*env,jobjectclazz)2. {3. spIBinderb=ProcessState::self()getContextObject(NULL)。4. returnjavaObjectForIBinder(env,b)。5. } 這里看到我們熟悉的ProcessState::self()getContextObject函數(shù),具體可以參考淺談Android系統(tǒng)進程間通信(IPC)機制Binder中的Server和Client獲得Service Manager接口之路一文。ProcessState::self()getContextObject函數(shù)返回一個BpBinder對象,它的句柄值是0,即下面語句:view plain1. spIBinderb=ProcessState::self()getContextObject(NULL)。 相當于是:view plain1. spIBinderb=newBpBinder(0)。 接著調(diào)用javaObjectForIBinder把這個BpBinder對象轉(zhuǎn)換成一個BinderProxy對象:view plain1. jobjectjavaObjectForIBinder(JNIEnv*env,constspIBinderamp。val)2. {3. if(val==NULL)returnNULL。4. 5. if(valcheckSubclass(amp。gBinderOffsets)){6. //Oneofourown!7. jobjectobject=static_castJavaBBinder*(())object()。8. //printf(objectForBinder%p:it39。sourown%p!\n,(),object)。9. returnobject。10. }11. 12. //Fortherestofthefunctionwewillholdthislock,toserialize13. //looking/creationofJavaproxiesfornativeBinderproxies.14. AutoMutex_l(mProxyLock)。15. 16. //Someoneelse39。s...doweknowaboutit?17. jobjectobject=(jobject)valfindObject(amp。gBinderProxyOffsets)。18. if(object!=NULL){19. jobjectres=envCallObjectMethod(object,)。20. if(res!=NULL){21. LOGV(objectForBinder%p:foundexisting%p!\n,(),res)。22. returnres。23. }24. LOGV(Proxyobject%pofIBinder%pnolongerinworkingset!!!,object,())。25. android_atomic_dec(amp。gNumProxyRefs)。26. valdetachObject(amp。gBinderProxyOffsets)。27. envDeleteGlobalRef(object)。28. }29. 30. object=envNewObject(,)。31. if(object!=NULL){32. LOGV(objectForBinder%p:creatednew%p!\n,(),object)。33. //Theproxyholdsareferencetothenativeobject.34. envSetIntField(object,,(int)())。35. valincStrong(object)。36. 37. //Thenativeobjectneedstoholdaweakreferencebacktothe38. //proxy,sowecanretrievethesameproxyifitisstillactive.39. jobjectrefObject=envNewGlobalRef(40. envGetObjectField(object,))。41. valattachObject(amp。gBinderProxyOffsets,refObject,42. jnienv_to_javavm(env),proxy_cleanup)。43. 44. //Notethatanewobjectreferencehasbeencreated.45. android_atomic_inc(amp。gNumProxyRefs)。46. incRefsCreated(env)。47. }48. 49. returnobject。50. } 在介紹這個函數(shù)之前,先來看兩個變量gBinderOffsets和gBinderProxyOffsets的定義。 先看gBinderOffsets的定義:view plain1. staticstructbindernative_offsets_t2. {3. //Classstate.4. jclassmClass。5. jmethodIDmExecTransact。6. 7. //Objectstate.8. jfieldIDmObject。9. 10. }gBinderOffsets。 簡單來說,gBinderOffsets變量是用來記錄上面第二個類圖中的Binder類的相關(guān)信息的,它是在注冊Binder類的JNI方法的int_register_android_os_Binder函數(shù)初始化的:view plain1. constchar*constkBinderPathName=android/os/Binder。2. 3. staticintint_register_android_os_Binder(JNIEnv*env)4. {5. jclassclazz。6. 7. clazz=envFindClass(kBinderPathName)。8. LOG_FATAL_IF(clazz==NULL,Unabletofindclass)。9. 10. =(jclass)envNewGlobalRef(clazz)。11. 12. =envGetMethodID(clazz,execTransact,(IIII)Z)。13. assert()。14. 15. 16. =envGetFieldID(clazz,mObject,I)。17. assert()。18. 19
點擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
公安備案圖鄂ICP備17016276號-1