日韩性视频-久久久蜜桃-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ò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 欧美大片免费 | 免费人成在线观看 | 妞干网这里只有精品 | 国产精品久久久久久妇女 | 成年人黄色免费视频 | 亚洲综合图区 | 无限国产资源 | 色综合久久中文字幕无码 | 久久av综合 | 婷婷六月在线 | 亚洲午夜精品 | 久久夜色精品国产欧美乱极品 | 综合网五月 | 亚洲天堂影视 | 精品无码国产一区二区三区av | 亚洲一区二区蜜桃 | 日韩乱码一区二区三区 | 亚洲精品黄色片 | www欧美com| 欧美香蕉 | 欧美黄色a视频 | 日本黄网站在线观看 | 交hdsexvideos娇小| 国产精品7777777| 亚洲三区在线观看无套内射 | free性丰满69性欧美 | 在线观看视频二区 | 天堂а√在线中文在线鲁大师 | 日韩美女啪啪 | 亚洲黄色在线观看视频 | 国产色黄| 国产精品一二三四区 | 欧美成人精品在线观看 | 就去吻亚洲| 亚洲视频手机在线 | 成人欧美一区二区三区小说 | 伊人久久大香线蕉综合网站 | 少妇无码一区二区三区 | 久久欲 | 又黄又爽视频在线观看 | 亚洲啪av永久无码精品放毛片 | 成人亚洲免费 | 超碰av男人的天堂 | 免费v片在线观看 | 超在线视频 | 中文字幕人妻色偷偷久久 | 成人综合站 | 国产精品久久久久久影视 | 久久国产乱子伦免费精品 | 日本二区视频 | 爱情岛论语亚洲入口 | 精品日本一区二区三区在线观看 | 日本偷拍一区 | 亚洲精品av中文字幕在线在线 | 亚洲图片欧美另类 | 视频一区三区 | 毛片无码免费无码播放 | 亚洲网站视频 | 国产伦精品一区二区三区免费 | 97无码精品人妻 | 日韩欧美国产一区二区在线观看 | 在线中文一区 | 性欢交69精品久久久 | 亚洲熟妇无码爱v在线观看 九色福利 | 日本成人精品 | 狠狠夜夜 | 国产黄色片免费 | 国产视频精品一区二区三区 | 欧美黑人一区二区 | 拔插拔插海外华人免费视频 | 久久精品免费在线 | 亚洲av无码一区二区三区网站 | 日韩欧美一区二区三区 | 欧美xxxx性 | 久久亚洲欧美 | 九九热免费在线 | 精品国产露脸精彩对白 | 性高潮久久久久久久 | 国产在线xxxx | 午夜影院体验区 | 99久久久无码国产精品性黑人 | 欧美激情 在线 | 99热在线国产| 同人动漫在线观看 | 久草视频中文在线 | 国产v在线观看 | 手机免费看av | 欧美三级图片 | 天天干干 | 99热这里是精品 | 在线免费观看视频网站 | 成 人片 黄 色 大 片 | 欧美精品久久久久性色 | 春物催眠 | 成人aⅴ视频 | 国产免费a | 国内免费av| 国产女主播喷水视频在线观看 | av午夜激情 |