日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析(6)

發(fā)布時(shí)間:2025/4/5 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析(6) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ?接下來(lái),我們?cè)賮?lái)看看server模塊的實(shí)現(xiàn)。在external/ashmem/common目錄下,只有一個(gè)源文件SharedBufferServer.cpp,它實(shí)現(xiàn)了內(nèi)存共享服務(wù)SharedBufferService:

  • #define?LOG_TAG?"SharedBufferServer"??
  • ??
  • #include?<utils/Log.h>??
  • #include?<binder/MemoryBase.h>??
  • #include?<binder/MemoryHeapBase.h>??
  • #include?<binder/IServiceManager.h>??
  • #include?<binder/IPCThreadState.h>??
  • ??
  • #include?"../common/ISharedBuffer.h"??
  • ??
  • class?SharedBufferService?:?public?BnSharedBuffer??
  • {??
  • public:??
  • ????SharedBufferService()??
  • ????{??
  • ????????sp<MemoryHeapBase>?heap?=?new?MemoryHeapBase(SHARED_BUFFER_SIZE,?0,?"SharedBuffer");??
  • ????????if(heap?!=?NULL)??
  • ????????{??
  • ????????????mMemory?=?new?MemoryBase(heap,?0,?SHARED_BUFFER_SIZE);??
  • ??
  • ????????????int32_t*?data?=?(int32_t*)mMemory->pointer();??
  • ????????????if(data?!=?NULL)??
  • ????????????{??
  • ????????????????*data?=?0;??
  • ????????????}??
  • ????????}??
  • ????}??
  • ??
  • ????virtual?~SharedBufferService()??
  • ????{??
  • ????????mMemory?=?NULL;??
  • ????}??
  • ??
  • public:??
  • ????static?void?instantiate()??
  • ????{??
  • ????????defaultServiceManager()->addService(String16(SHARED_BUFFER_SERVICE),?new?SharedBufferService());??
  • ????}??
  • ??
  • ????virtual?sp<IMemory>?getBuffer()??
  • ????{??
  • ????????return?mMemory;??
  • ????}??
  • ??
  • private:??
  • ????sp<MemoryBase>?mMemory;??
  • };??
  • ??
  • int?main(int?argc,?char**?argv)??
  • {??
  • ????SharedBufferService::instantiate();??
  • ??
  • ????ProcessState::self()->startThreadPool();??
  • ????IPCThreadState::self()->joinThreadPool();??
  • ??
  • ????return?0;??
  • }??
  • ?? ? ? ?SharedBufferService服務(wù)實(shí)現(xiàn)了BnSharedBuffer接口。在它的構(gòu)造函數(shù)里面,首先是使用MemoryHeapBase類創(chuàng)建了一個(gè)匿名共享內(nèi)存,大小為SHARED_BUFFER_SIZE。接著,又以這個(gè)MemoryHeapBase對(duì)象為參數(shù),創(chuàng)建一個(gè)MemoryBase對(duì)象,這個(gè)MemoryBase對(duì)象指定要維護(hù)的匿名共享內(nèi)存的的偏移位置為0,大小為SHARED_BUFFER_SIZE,并且,將這個(gè)匿名共享內(nèi)存當(dāng)作一個(gè)整型變量地址,將它初始化為0。最終,這個(gè)匿名共享內(nèi)存對(duì)象保存在SharedBufferService類的成員變量mMemory中,這個(gè)匿名共享內(nèi)存對(duì)象可以通過(guò)成員函數(shù)getBuffer來(lái)獲得。 ?? ? ? ?在Server端應(yīng)用程序的入口函數(shù)main中,首先是調(diào)用SharedBufferService靜態(tài)成員函數(shù)instantiate函數(shù)來(lái)創(chuàng)建一個(gè)SharedBufferService實(shí)例,然后通過(guò)defaultServiceManager函數(shù)來(lái)獲得系統(tǒng)中的Service Manager接口,最后通過(guò)這個(gè)Service Manager接口的addService函數(shù)來(lái)把這個(gè)SharedBufferService服務(wù)添加到Service Manager中去,這樣,Client端就可以通過(guò)Service Manager來(lái)獲得這個(gè)共享內(nèi)存服務(wù)了。有關(guān)Service Manager的實(shí)現(xiàn),請(qǐng)參考前面一篇文章淺談Service Manager成為Android進(jìn)程間通信(IPC)機(jī)制Binder守護(hù)進(jìn)程之路,而用來(lái)獲取Service Manager接口的defaultServiceManager函數(shù)的實(shí)現(xiàn)可以參考另外一篇文章淺談Android系統(tǒng)進(jìn)程間通信(IPC)機(jī)制Binder中的Server和Client獲得Service Manager接口之路。初始化好這個(gè)共享內(nèi)存服務(wù)之后,程序就通過(guò)ProcessState::self()->startThreadPool()函數(shù)來(lái)創(chuàng)建一個(gè)線程等待Client端來(lái)請(qǐng)求服務(wù)了,最后,程序的主線程也通過(guò)IPCThreadState::self()->joinThreadPool()函數(shù)來(lái)進(jìn)入到等待Client端來(lái)請(qǐng)求服務(wù)的狀態(tài)中。 ?? ? ? 我們還需要為這個(gè)Server端應(yīng)用程序編譯一個(gè)編譯腳本,在external/ashmem/server目錄下,新建一個(gè)Android.mk文件,它的內(nèi)容如下所示:
  • LOCAL_PATH?:=?$(call?my-dir)??
  • ??
  • include?$(CLEAR_VARS)??
  • ??
  • LOCAL_MODULE_TAGS?:=?optional??
  • ??
  • LOCAL_SRC_FILES?:=?../common/ISharedBuffer.cpp?\??
  • ????????SharedBufferServer.cpp??
  • ??
  • LOCAL_SHARED_LIBRARIES:=?libcutils?libutils?libbinder??
  • ??
  • LOCAL_MODULE?:=?SharedBufferServer??
  • ??
  • include?$(BUILD_EXECUTABLE)??
  • ?? ? ? ?最后,我們?cè)賮?lái)看看client模塊的實(shí)現(xiàn)。在external/ashmem/client目錄下,只有一個(gè)源文件SharedBufferClient.cpp,它的內(nèi)容如下所示:
  • #define?LOG_TAG?"SharedBufferClient"??
  • ??
  • #include?<utils/Log.h>??
  • #include?<binder/MemoryBase.h>??
  • #include?<binder/IServiceManager.h>??
  • ??
  • #include?"../common/ISharedBuffer.h"??
  • ??
  • int?main()??
  • {??
  • ????????sp<IBinder>?binder?=?defaultServiceManager()->getService(String16(SHARED_BUFFER_SERVICE));??
  • ????????if(binder?==?NULL)??
  • ????????{??
  • ????????????????printf("Failed?to?get?service:?%s.\n",?SHARED_BUFFER_SERVICE);??
  • ????????????????return?-1;??
  • ????????}??
  • ??
  • ????????sp<ISharedBuffer>?service?=?ISharedBuffer::asInterface(binder);??
  • ????????if(service?==?NULL)??
  • ????????{??
  • ????????????????return?-2;??
  • ????????}??
  • ??
  • ????????sp<IMemory>?buffer?=?service->getBuffer();??
  • ????????if(buffer?==?NULL)??
  • ????????{??
  • ????????????????return?-3;??
  • ????????}??
  • ??
  • ????????int32_t*?data?=?(int32_t*)buffer->pointer();??
  • ????????if(data?==?NULL)??
  • ????????{??
  • ????????????????return?-4;??
  • ????????}??
  • ??
  • ????????printf("The?value?of?the?shared?buffer?is?%d.\n",?*data);??
  • ??
  • ????????*data?=?*data?+?1;??
  • ??
  • ????????printf("Add?value?1?to?the?shared?buffer.\n");??
  • ??
  • ????????return?0;??
  • }??
  • ?? ? ? ?在這個(gè)文件中,主要就是定義了Client端應(yīng)用程序的入口函數(shù)main,在這個(gè)main函數(shù)里面,首先通過(guò)Service Manager接口獲得前面所實(shí)現(xiàn)的匿名共享內(nèi)存服務(wù)SharedBufferService的遠(yuǎn)程接口service,然后通過(guò)這個(gè)遠(yuǎn)程接口的getBuffer成員函數(shù)獲得由Server端提供的一塊匿名共享內(nèi)存接口buffer,最后通過(guò)這個(gè)匿名共享內(nèi)存接口獲得這個(gè)匿名共享內(nèi)存的基地址data。有了這個(gè)匿名共享內(nèi)存的地址data之后,我們就可以對(duì)它進(jìn)行讀寫(xiě)了,先是把這個(gè)匿名共享內(nèi)存當(dāng)作是一個(gè)整型變量地址進(jìn)行訪問(wèn),并輸出它的值的大小,然后對(duì)這個(gè)整量變量進(jìn)行加1的操作,并寫(xiě)回到原來(lái)的共享內(nèi)存空間中去。這樣,當(dāng)Server端應(yīng)用程序運(yùn)行之后,第一次運(yùn)行這個(gè)Client端應(yīng)用程序時(shí),輸出的值為0,第二次運(yùn)行這個(gè)個(gè)Client端應(yīng)用程序時(shí),輸出的值為1,第三次運(yùn)行這個(gè)個(gè)Client端應(yīng)用程序時(shí),輸出的值為3......依次類推,后面我們將在模擬器中對(duì)這個(gè)分析進(jìn)行驗(yàn)證,如果驗(yàn)證成功的話,就說(shuō)明這個(gè)匿名共享內(nèi)存成功地在Server端和Client端實(shí)現(xiàn)共享了。

    ?

    總結(jié)

    以上是生活随笔為你收集整理的Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析(6)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。