簡體   English   中英

如何在Android中使用共享內存(IPC)

[英]How to use Shared Memory (IPC) in Android

我已經在Linux中編寫了一個簡單的Shared Memory C程序。
如何在Android中使用共享內存(或者我應該稱之為“ashmem?”)?

我希望你能給我一步一步的指導。

這對我有用:
1)打開一個MemoryFile對象:mFile;
2)創建一個服務,使用mmap將其映射到ashem;
3)使用ParcelFileDescriptor pfd將本機文件描述符(fd)返回給綁定到您的服務的客戶端;
4)為使用md的客戶端創建JNI並使用mmap映射到灰燼;
5)使用此fd創建InputStream,現在客戶端可以使用InputStream對象讀/寫相同的內存區域。
鏈接顯示如何將MemoryFile映射到ashem。 鏈接顯示如何通過AIDL和ParcelFileDescriptor將本機文件描述符(fd)發送到客戶端。

在服務器端,您將需要創建:
1)通過ParcelFileDescriptor將本地fd傳遞給客戶端的服務和AIDL; 2)服務端的JNI,用於執行映射。

在客戶端:1)綁定服務然后調用服務獲取本機fd的方法; 2)將fd映射到ashem的JNI。

然后,服務和客戶端可以讀/寫映射的存儲器區域。

一個過程通過以下步驟創建一個新的ashmem區域:

(1)打開設備文件“/ dev / ashmem”並獲取文件描述符。 (2)調用ASHMEM_SET_NAME ioctl設置ashmem名稱。 它似乎是虛擬設備文件,因此如果將其命名為“my_mem”,則文件名將更改為“/ dev / ashmem / my_mem”。 (3)調用ASHMEM_SET_SIZE ioctl設置ashmem大小,以字節為單位。

cutils庫有一個函數“ashmem_create_region”,它將這些步驟包裝成單個函數調用:

int fd = ashmem_create_region("my_mem", PAGE_SIZE * 20);

文件描述符可以與其他進程共享。 Android提供了一種在表兄弟進程之間共享文件描述符的特殊方法,使用另一種名為“binder”的服務。 然后每個進程mmaps文件:

char *map = mmap(NULL, PAGE_SIZE * 20, PROT_READ|PROT_WRITE,
                                       MAP_SHARED, fd, 0);

瞧! 即時共享內存。

在Android中使用binder IPC。 我認為綁定器使用內核內存,它在所有進程中共享,用於進程間通信。

好吧,如果你想使用共享內存API,這里有一個解決方案https://github.com/pelya/android-shmem

像魔術一樣,它完美無缺。 您可以使用shmget(),shmat()和shmdt()API無縫地在獨立進程中使用android中的共享內存。 試試看。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM