一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Binder機(jī)制,從Java到C (6. Binder in Native : libbinder)

 just_person 2014-11-14

1.Java和C++中的Binder

從前一篇 Binder機(jī)制,從Java到C (5. IBinder對(duì)象傳遞形式) 中可以看到,使用Binder的Java代碼,到最后都會(huì)進(jìn)入到Native環(huán)境,將具體的分發(fā)工作交給執(zhí)行效率更高的Native代碼。
而這些Native的實(shí)現(xiàn)都會(huì)統(tǒng)一到一個(gè)lib:libbinder。
在前面的講述中,我們已經(jīng)接觸到了native中的JavaBBinder,BBinder,JavaBBinderHolder

 

把一些相關(guān)的類整理一下,可以得到下面Java和C++代碼的關(guān)系:

 

 

Java環(huán)境里的Binder的對(duì)象,會(huì)通過JNI 調(diào)用init()方法,創(chuàng)建一個(gè)JavaBBinderHolder,從而使自己映射到Native環(huán)境里的BBinder。將兩個(gè)環(huán)境里的Binder對(duì)象映射在一起。

 

2.transact()
BinderProxy中的transact()是以JNI的方式實(shí)現(xiàn)的,那它就是Java層和C++層的溝通紐帶,Java通過它可以進(jìn)一步和native交互。

Java環(huán)境里的的Binder,有一個(gè)private 的execTransact()方法,其實(shí)就是Native環(huán)境的callback,也就是C++層回到Java層的一個(gè)入口。

JNI代碼在執(zhí)行Native環(huán)境的onTransact()方法時(shí),會(huì)通過回調(diào)Java環(huán)境里的execTransact()方法,從而回調(diào)到Java里實(shí)現(xiàn)的onTransact()方法。

 

 

 

3.libinder

Binder在Java環(huán)境中大量使用了面向?qū)ο蟮闹貥?gòu)技巧,盡可能的實(shí)現(xiàn)通用操作。于是,為了支持給Java環(huán)境提供的靈活功能,在Native層的Binder,也需要具備面向?qū)ο蟮哪芰?。libbinder的文件路徑:
/framework/native/include/binder/
    Binder.h
    BinderService.h
    BpBinder.h
    Ibinder.h
    IInterface.h
    IPCThreadState.h
    IpermissionController.h
    IserviceManager.h
    MemoryBase.h
    MemoryDealer.h
    MemoryHeapBase.h
    Parcel.h
    PermissionCache.h
    ProcessState.h
/framework/native/lib/binder/binder/
    Binder.cpp
    BpBinder.cpp
    Iinterface.cpp
    Imemory.cpp
    IPCThreadState.cpp
    IpermissionController.cpp
    IserviceManager.cpp
    MemoryBase.cpp
    MemoryDealer.cpp
    MemoryHeapBase.cpp
    Parcel.cpp
    PermissionCache.cpp
    ProcessState.cpp
    Static.cpp

 

為了能映射Java代碼,C++實(shí)現(xiàn)的Binder庫會(huì)和Java環(huán)境里的Binder概念有相似互通之處:

IInterface.h,定義IInterface接口類。與Java的IInterface接口類對(duì)應(yīng),但與Java環(huán)境不同,C++環(huán)境里需要提供Binder通信實(shí)現(xiàn),所以在內(nèi)部被進(jìn)一步拆分成BpInterface(Proxy端對(duì)象)、BnInterface(Stub端對(duì)象)兩個(gè)模板,從而使用不同模板參數(shù),可以使用對(duì)同一IInterface接口的訪問,得到不同功能實(shí)現(xiàn)。

IBinder.h,定義IBinder接口類。與Java環(huán)境的IBinder對(duì)應(yīng),提供Binder引用,并定義Binder對(duì)象所應(yīng)實(shí)現(xiàn)的方法。跟Java環(huán)境一樣,IBinder對(duì)象會(huì)是分別引用到Proxy對(duì)象或是Stub對(duì)象。

Binder.h,定義BBinder類。BBinder類與Java環(huán)境里的Binder類對(duì)應(yīng),是Binder的Stub實(shí)現(xiàn),通過onTransact()回調(diào)方法接收與處理Binder事件。但它更屬于Binder通訊的基礎(chǔ)類,并不會(huì)被直接使用,系統(tǒng)只會(huì)通過BBinder類的派生類進(jìn)行通信,所以它的類名是BBinder,Base Binder的意思。

BpBinder.h,定義BpBinder類。與Java環(huán)境里的Stub.Proxy對(duì)象對(duì)應(yīng),是Binder的Proxy端實(shí)現(xiàn)。作為Proxy端,又是Binder最底層的封裝,這一類的本質(zhì)作用只是提供一個(gè)transact()方法,從而給上層封裝的IPC請(qǐng)求提供最終的Binder通信接口。

 Parcel.h,定義Parcel類。雖然概念上與Java里實(shí)現(xiàn)序列化的Parcel類是對(duì)應(yīng)的,也提供同樣的操作方法。但在實(shí)現(xiàn)上,Native環(huán)境里的Parcel是提供Java環(huán)境里的Parcel概念的一種基礎(chǔ),所有的Parcel的read|write_*()系列的方法,底層全是由Native代碼來實(shí)現(xiàn)具體的讀寫操作。

 

4.Binder通信類

那有了Binder通信封裝的類,如何操作Binder 驅(qū)動(dòng)來通信呢?
在libbinder里,有兩個(gè)專門的類來完成真正的Binder消息的讀寫操作 : ProcessStateIPCThreadState。


ProcessState.h,定義ProcessState類。正如這個(gè)類的名字所表述的,這個(gè)類的作用就是維護(hù)和IPC相關(guān)的process state,對(duì)于任一使用Binder的進(jìn)程而言,進(jìn)程空間里只會(huì)有一個(gè)ProcessState對(duì)象。

IPCThreadState.h,定義類IPCThreadState。這個(gè)類描述以thread為基礎(chǔ)的IPC傳輸狀態(tài),Binder通信的讀寫過程便在這個(gè)類里完成。在IPCThreadState里,是以thread pool的方式來維護(hù)Binder的通信請(qǐng)求。

 

下面這個(gè)圖就是整個(gè)通信的流程,藍(lán)色部分是在Java里的,Java中通過BinderProxy的JNI調(diào)用,進(jìn)入到Native層,然后通過IPCThreadState的talkwithDriver()和Binder驅(qū)動(dòng)通信,Binder驅(qū)動(dòng)在做了一系列處理后,找到目標(biāo)進(jìn)程,也是從talkwithDriver()方法回去,然后走到JavaBBinder的transact(),這里就會(huì)去調(diào)用進(jìn)入Java層的入口函數(shù)execTransact()。再回到具體的執(zhí)行函數(shù)

 

 

5.輔助類

libbinder里會(huì)實(shí)現(xiàn)一些C++環(huán)境里的輔助類:


Imemory.h,生成兩個(gè)遠(yuǎn)程接口類,IMemoryIMemoryHeap,分別用于使用內(nèi)存和分配內(nèi)存。對(duì)于內(nèi)存使用兩個(gè)基于IBinder的接口類,就意味著申請(qǐng)內(nèi)存和分配內(nèi)存可以分別由單獨(dú)的process來提供。

 MemoryDealer.h,定義一個(gè)默認(rèn)的分配內(nèi)存的MemoryDealer類。在這個(gè)類里有一個(gè)簡單的內(nèi)存管理算法,需要提供內(nèi)存分配部分的時(shí)候,可以使用這個(gè)類來創(chuàng)建內(nèi)存空間,并通過IMemoryHeap共享出去。

MemoryBase.h,提供IMemory接口類的Stub端實(shí)現(xiàn)。這個(gè)類是用在使用內(nèi)存上的,可以通過它的getMemory()的方法返回一個(gè)IMemoryHeap實(shí)例。這個(gè)類是個(gè)基類,如果要使用IMemory接口,可以繼承這個(gè)類。

MemoryHeapBase.h,提供IMemoryHeap接口類的Stub端。用于遠(yuǎn)程共享的堆空間分配,根據(jù)不同的情況分配不同類型的內(nèi)存。

MemoryHeapPmem.h,實(shí)現(xiàn)基于Pmem機(jī)制(為了實(shí)現(xiàn)共享大尺寸連續(xù)物理內(nèi)存而開發(fā)的一種機(jī)制)并實(shí)現(xiàn)了IMemoryHeap接口。如果有特殊內(nèi)存堆的使用需求,可以通過MemoryHeadBase類派生出新的MemoryHead類,就像這個(gè)MemoryHeapPmem。

 

 

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    亚洲一区二区精品福利| 国产精品福利一级久久| 91亚洲国产日韩在线| 国产又大又硬又粗又湿| 真实国产乱子伦对白视频不卡| 日韩不卡一区二区视频| 五月情婷婷综合激情综合狠狠| 91麻豆精品欧美一区| 国产精品香蕉免费手机视频| 日韩一级毛一欧美一级乱| 久热在线视频这里只有精品| 少妇特黄av一区二区三区| 亚洲精品成人午夜久久| 国产精品流白浆无遮挡| 成人欧美精品一区二区三区| 免费一级欧美大片免费看| 伊人网免费在线观看高清版| 日韩精品中文字幕亚洲| 黑鬼糟蹋少妇资源在线观看| 黄色国产自拍在线观看| 东北老熟妇全程露脸被内射| 久久香蕉综合网精品视频| 国产午夜福利不卡片在线观看| 精品al亚洲麻豆一区| 亚洲黄香蕉视频免费看| 国产超碰在线观看免费| 熟女白浆精品一区二区| 国产精品熟女在线视频| 国产精品福利一级久久| 国产精品一区二区不卡中文| 国产中文另类天堂二区| 国产视频一区二区三区四区| 三级理论午夜福利在线看| 99久久国产综合精品二区| 亚洲精品偷拍视频免费观看| 亚洲欧洲在线一区二区三区| 日韩夫妻午夜性生活视频| 亚洲五月婷婷中文字幕| 欧美一区二区三区十区| 久久少妇诱惑免费视频| 欧美日韩免费黄片观看|