android中匿名共享內(nèi)存的核心函數(shù)

      網(wǎng)友投稿 669 2025-04-01

      理論基礎(chǔ)

      Android系統(tǒng)在應(yīng)用程序框架層中提供了兩個(gè)C++類(lèi)MemoryHeapBase和MemoryBase來(lái)創(chuàng)建和管理匿名共享內(nèi)存。 如果一個(gè)進(jìn)程需要與其他進(jìn)程共享一塊完整的匿名共享內(nèi)存,那么就可以通過(guò)使用MemoryHeapBase類(lèi)類(lèi)創(chuàng)建這塊匿名共享內(nèi)存。如果一個(gè)進(jìn)程創(chuàng)建一塊匿名共享內(nèi)存后,只希望與其他進(jìn)程共享其中的一部分,那么就可以通過(guò)MemoryBase類(lèi)來(lái)創(chuàng)建這塊匿名共享內(nèi)存。

      IMemory.h:定義內(nèi)存相關(guān)類(lèi)的接口,表示堆內(nèi)存的類(lèi)IMemoryHeap和BnMemoryHeap,表示一般內(nèi)存的類(lèi)IMemory和BnMemory。 MemoryHeapBase.h:定義類(lèi)MemoryHeapBase,繼承并實(shí)現(xiàn)BnMemoryHeap MemoryBase.h:定義類(lèi)MemoryBase,繼承并實(shí)現(xiàn)BnMemory。

      android中匿名共享內(nèi)存的核心函數(shù)

      Android系統(tǒng)在應(yīng)用程序框架層中提供了java類(lèi)MemoryFile來(lái)創(chuàng)建和管理匿名共享內(nèi)存。使用java類(lèi)MemoryFile創(chuàng)建的匿名共享內(nèi)存可以在不同的Android應(yīng)用程序之間進(jìn)行共享。

      java代碼解析

      匿名共享內(nèi)存java類(lèi)MemoryFile在系統(tǒng)中的source\frameworks\base\core\java\android\os\MemoryFile.java文件中實(shí)現(xiàn)。

      //匿名共享內(nèi)存的構(gòu)造函數(shù),參數(shù)1表示創(chuàng)建匿名共享內(nèi)存的名稱(chēng),參數(shù)2表示創(chuàng)建匿名共享內(nèi)存大小 public MemoryFile(String name, int length) throws IOException { mLength = length; if (length >= 0) { //通過(guò)調(diào)用jni的接口去打開(kāi)匿名共享內(nèi)存 mFD = native_open(name, length); } else { throw new IOException("Invalid length: " + length); } if (length > 0) { //進(jìn)行映射 mAddress = native_mmap(mFD, length, PROT_READ | PROT_WRITE); } else { mAddress = 0; } } 復(fù)制代碼

      C++關(guān)鍵函數(shù)解析

      //MemoryHeapBase構(gòu)造函數(shù)的實(shí)現(xiàn) MemoryHeapBase::MemoryHeapBase(const char* device, size_t size, uint32_t flags) : mFD(-1), mSize(0), mBase(MAP_FAILED), mFlags(flags), mDevice(0), mNeedUnmap(false), mOffset(0) { int open_flags = O_RDWR; if (flags & NO_CACHING) open_flags |= O_SYNC; //通過(guò)調(diào)用open打開(kāi)匿名共享內(nèi)存設(shè)備文件 int fd = open(device, open_flags); ALOGE_IF(fd<0, "error opening %s: %s", device, strerror(errno)); if (fd >= 0) { //指定的匿名共享內(nèi)存大小按頁(yè)對(duì)齊 const size_t pagesize = getpagesize(); size = ((size + pagesize-1) & ~(pagesize-1)); //匿名共享內(nèi)存映射到當(dāng)前進(jìn)程地址空間 if (mapfd(fd, size) == NO_ERROR) { mDevice = device; } } } 復(fù)制代碼

      //MemoryHeapBase構(gòu)造函數(shù) MemoryHeapBase::MemoryHeapBase(size_t size, uint32_t flags, char const * name) : mFD(-1), mSize(0), mBase(MAP_FAILED), mFlags(flags), mDevice(0), mNeedUnmap(false), mOffset(0) { //獲得系統(tǒng)中頁(yè)大小的內(nèi)存 const size_t pagesize = getpagesize(); //內(nèi)存頁(yè)對(duì)齊 size = ((size + pagesize-1) & ~(pagesize-1)); //創(chuàng)建一塊匿名共享內(nèi)存 int fd = ashmem_create_region(name == NULL ? "MemoryHeapBase" : name, size); ALOGE_IF(fd<0, "error creating ashmem region: %s", strerror(errno)); if (fd >= 0) { //創(chuàng)建的匿名共享內(nèi)存映射到當(dāng)前進(jìn)程地址空間中 if (mapfd(fd, size) == NO_ERROR) { if (flags & READ_ONLY) {//如果地址映射成功,修改匿名共享內(nèi)存的訪問(wèn)屬性 ashmem_set_prot_region(fd, PROT_READ); } } } }

      Android 任務(wù)調(diào)度

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:FTP上傳錯(cuò)誤詳解
      下一篇:excel調(diào)整文字行間距(excel調(diào)整文字行間距調(diào)小)
      相關(guān)文章
      亚洲一区二区中文| 国产午夜亚洲精品国产成人小说| 亚洲AV永久无码区成人网站| 亚洲一区二区三区免费| 苍井空亚洲精品AA片在线播放| 亚洲另类自拍丝袜第五页| 久久夜色精品国产噜噜亚洲a| 国产成+人+综合+亚洲专| 亚洲a∨无码男人的天堂| 亚洲另类古典武侠| 中文字幕在线观看亚洲视频| 国产成人精品日本亚洲专一区| 亚洲人成人77777网站不卡| 精品亚洲AV无码一区二区| 国产精品亚洲精品| 亚洲欧美乱色情图片| 久久亚洲精品成人无码| 日韩亚洲人成网站| 亚洲无码高清在线观看| 亚洲人成网站在线播放vr| 亚洲成AV人片在线观看ww| 亚洲三级电影网址| 亚洲欧洲日产专区| 亚洲AV无码乱码精品国产| 亚洲国产人成精品| 亚洲中文字幕不卡无码| 亚洲国产精品无码中文字| 久久精品亚洲一区二区三区浴池| 亚洲精品在线播放| 亚洲精品天堂在线观看| 精品国产亚洲第一区二区三区| 亚洲国产精品成人| 精品久久久久久亚洲| 久久亚洲精精品中文字幕| 亚洲1234区乱码| 韩国亚洲伊人久久综合影院| 美腿丝袜亚洲综合| 久久亚洲私人国产精品vA| 亚洲一欧洲中文字幕在线| 国产亚洲一卡2卡3卡4卡新区| 亚洲视频在线免费|