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

正文內(nèi)容

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

2025-03-23 05:06 本頁面


【正文】 . returnAndroidRuntime::registerNativeMethods(20. env,kBinderPathName,21. gBinderMethods,NELEM(gBinderMethods))。22. } 再來看gBinderProxyOffsets的定義:view plain1. staticstructbinderproxy_offsets_t2. {3. //Classstate.4. jclassmClass。5. jmethodIDmConstructor。6. jmethodIDmSendDeathNotice。7. 8. //Objectstate.9. jfieldIDmObject。10. jfieldIDmSelf。11. 12. }gBinderProxyOffsets。 簡單來說,gBinderProxyOffsets是用來變量是用來記錄上面第一個圖中的BinderProxy類的相關(guān)信息的,它是在注冊BinderProxy類的JNI方法的int_register_android_os_BinderProxy函數(shù)初始化的:view plain1. constchar*constkBinderProxyPathName=android/os/BinderProxy。2. 3. staticintint_register_android_os_BinderProxy(JNIEnv*env)4. {5. jclassclazz。6. 7. clazz=envFindClass(java/lang/ref/WeakReference)。8. LOG_FATAL_IF(clazz==NULL,Unabletofindclass)。9. =(jclass)envNewGlobalRef(clazz)。10. 11. =envGetMethodID(clazz,get,()Ljava/lang/Object。)。12. assert()。13. 14. clazz=envFindClass(java/lang/Error)。15. LOG_FATAL_IF(clazz==NULL,Unabletofindclass)。16. =(jclass)envNewGlobalRef(clazz)。17. 18. clazz=envFindClass(kBinderProxyPathName)。19. LOG_FATAL_IF(clazz==NULL,Unabletofindclass)。20. 21. =(jclass)envNewGlobalRef(clazz)。22. 23. =envGetMethodID(clazz,init,()V)。24. assert()。25. 26. =envGetStaticMethodID(clazz,sendDeathNotice,(Landroid/os/IBinder$DeathRecipient。)V)。27. assert()。28. 29. 30. =envGetFieldID(clazz,mObject,I)。31. assert()。32. 33. =envGetFieldID(clazz,mSelf,Ljava/lang/ref/WeakReference。)。34. assert()。35. 36. returnAndroidRuntime::registerNativeMethods(37. env,kBinderProxyPathName,38. gBinderProxyMethods,NELEM(gBinderProxyMethods))。39. } 回到前面的javaObjectForIBinder函數(shù)中,下面這段代碼:view plain1. if(valcheckSubclass(amp。gBinderOffsets)){2. //Oneofourown!3. jobjectobject=static_castJavaBBinder*(())object()。4. //printf(objectForBinder%p:it39。sourown%p!\n,(),object)。5. returnobject。6. } 前面說過,這里傳進來的參數(shù)是一個BpBinder的指針,而BpBinder::checkSubclass繼承于父類IBinder::checkSubclass,它什么也不做就返回false。 于是函數(shù)繼續(xù)往下執(zhí)行:view plain1. jobjectobject=(jobject)valfindObject(amp。gBinderProxyOffsets)。 由于這個BpBinder對象是第一創(chuàng)建,它里面什么對象也沒有,因此,這里返回的object為NULL。 于是函數(shù)又繼續(xù)往下執(zhí)行:view plain1. object=envNewObject(,)。 這里,就創(chuàng)建了一個BinderProxy對象了。創(chuàng)建了之后,要把這個BpBinder對象和這個BinderProxy對象關(guān)聯(lián)起來:view plain1. envSetIntField(object,,(int)())。 接下去,還要把它放到BpBinder里面去,下次就要使用時,就可以在上一步調(diào)用BpBinder::findObj把它找回來了:view plain1. valattachObject(amp。gBinderProxyOffsets,refObject,2. jnienv_to_javavm(env),proxy_cleanup)。 最后,就把這個BinderProxy返回到android_os_BinderInternal_getContextObject函數(shù),于是,我們就獲得一個BinderProxy對象了。 ,從下面語句返回:view plain1. sServiceManager=(())。 相當于是:view plain1. sServiceManager=(newBinderProxy())。 ,這個函數(shù)定義在frameworks/base/core/java/android/os/:view plain1. publicabstractclassServiceManagerNative......2. {3. ......4. staticpublicIServiceManagerasInterface(IBinderobj)5. {6. if(obj==null){7. returnnull。8. }9. IServiceManagerin=10. (IServiceManager)(descriptor)。11. if(in!=null){12. returnin。13. }14. 15. returnnewServiceManagerProxy(obj)。16. }17. ......18. } 這里的參數(shù)obj是一個BinderProxy對象,它的queryLocalInterface函數(shù)返回null。因此,最終以這個BinderProxy對象為參數(shù)創(chuàng)建一個ServiceManagerProxy對象。 ,從下面語句返回:view plain1. sServiceManager=(newBinderProxy())。 就相當于是:view plain1. sServiceManager=newServiceManagerProxy(newBinderProxy())。 于是,我們的目標終于完成了。 總結(jié)一下,就是在Java層,我們擁有了一個Service Manager遠程接口ServiceManagerProxy,而這個ServiceManagerProxy對象在JNI層有一個句柄值為0的BpBinder對象與之通過gBinderProxyOffsets關(guān)聯(lián)起來。 這樣獲取Service Manager的Java遠程接口的過程就完成了。 二.HelloService接口的定義 前面我們在學(xué)習(xí)Android系統(tǒng)的硬件抽象層(HAL)時,在在Ubuntu上為Android系統(tǒng)的Application Frameworks層增加硬件訪問服務(wù)這篇文章中,我們編寫了一個硬件服務(wù)HelloService,它的服務(wù)接口定義在frameworks/base/core/java/android/os/:view plain1. package2. 3. interfaceIHelloService4. {5. voidsetVal(intval)。6. intgetVal()。7. } 這個服務(wù)接口很簡單,只有兩個函數(shù),分別用來讀寫硬件寄存器。 注意,這是一個aidl文件。我們來看一下這個文件的內(nèi)容隱藏著什么奧秘,可以這么神奇地支持進程間通信。view plain1. /*2. *Thisfileisautogenerated.DONOTMODIFY.3. *Originalfile:frameworks/base/core/java/android/os/4. */5. package6. publicinterfaceIHelloServiceextends7. {8. /**LocalsideIPCimplementationstubclass.*/9. publicstaticabstractclassStubextendsimplements10. {11. privatestaticfinalDESCRIPTOR=12. /**Constructthestubatattachittotheinterface.*/13. publicStub()14. {15. (this,DESCRIPTOR)。16. }17. 18. /**19. *CastanIBinderobjectintoaninterface,20. *generatingaproxyifneeded.21. */22. publicstaticasInterface(obj)23. {24. if((obj==null)){25. returnnull。26. }27. iin=()(DESCRIPTOR)。28. if(((iin!=null)amp。amp。(iininstanceof))){29. return(()iin)。30. }31. returnnew(obj)。32. }33. 34. publicasBinder()35. {36. returnthis。37. }38. 39. @Override40. publicbooleanonTransact(intcode,data,reply,intflags)throws41. {42. 16
點擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1