[英]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.