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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android 进程间的通信,Android native进程间通信实例-binder结合共享内存

發布時間:2024/4/18 Android 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 进程间的通信,Android native进程间通信实例-binder结合共享内存 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在android源碼的驅動目錄下,一般會有共享內存的相關實現源碼,目錄是:kerneldriversstagingandroidashmem.c。但是本篇文章不是講解android共享內存的功能實現原理,而是講怎么運用它。

1.

在linux中,不同進程間擁有自己獨立的內存空間,32位操作系統中好像一個進程能用的內存大小是4G吧。而且一般不同進程間不能夠互相使用各自內存的數據。

當然不同進程間共享數據方法很多,比如之前說的進程間通信binder,socket等等,不過android出了一個共享內存的概念,為的是不同進程間能夠共同操作同一塊內存數據,比如進程1001往一塊共享內存addr里面寫數據“hello world”,進程1009往這塊共享內存addr讀取出“hello world”,也能夠往這塊共享內存addr寫數據“hello china”。這就是共同享用了一塊內存的基本概念了(說白了就是同耕一塊田)。講的夠仔細了吧,如果不清楚評論區見。

注意:好像binder傳輸的數據實現也是類似于共享內存,讀者可以自行去了解。

2.

先說一下等會寫程序的思路:

首先想想代碼編譯出兩個可執行文件后如何操作,打開兩個終端,都進入設備adb shell,第一個終端執行進程a,第二個終端執行進程b。在進程a輸入一串數據后,在進程b中可以讀出這段數據(也能夠改寫這段數據,讀者可以自行添加這部分功能)。

然后再想想實現的方式,

進程a:1. 創建共享內存,設置共享內存大小,這時會得到一個fd。2. 獲取共享內存地址。3. 先讀取地址數據,然后往地址寫入數據。4. 把fd通過binder發送給需要使用的進程。

進程b:1. 通過binder讀取到fd。2. 用fd獲取共享內存地址。3. 讀取共享內存數據,然后往地址寫入數據。

注意:linux一切皆文件,所以文件描述符fd很重要。

3.

3.1

捋清思路后,就可以開始寫代碼了(android.mk的編寫可以參考之前的文章),進程a,命名為mysharememory_a代碼如下:

#include #include#include#include#include#include#include#include#include#include#include#include#include

#define DEVASHMEM "/dev/ashmem"

#define SHNAME "hellomemory"

#define MAXBUFSIZE 1024

#define TRANSFDCODE 1000

#define WRITEDATACODE 1001

using namespaceandroid;int main(int argc, char *argv[])

{

int fd =open(DEVASHMEM, O_RDWR);if(fd < 0)

{return -1;

}int ret =ioctl(fd, ASHMEM_SET_NAME, SHNAME);if(ret < 0){

close(fd);return -1;

}char *get_sh_addr_write =NULL;

ret=ioctl(fd, ASHMEM_SET_SIZE, MAXBUFSIZE);if(ret < 0){

close(fd);return -1;

}

get_sh_addr_write= (char*)mmap(NULL, MAXBUFSIZE , PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);if(NULL ==get_sh_addr_write)

{return -1;

}

sp sm =defaultServiceManager();

sp binder = sm->checkService(String16("mybindertag"));

Parcel data, reply;

data.writeDupFileDescriptor(fd);

binder->transact(TRANSFDCODE, data, &reply);char input_data[MAXBUFSIZE] = {0};while(1)

{

printf("read share memory buf is %sn", get_sh_addr_write);

printf("please input data to buf :");

scanf("%s", input_data);

getchar();

strcpy(get_sh_addr_write,input_data);

binder->transact(WRITEDATACODE, data, &reply);

}returnret;

}

3.2

mysharememory_b代碼如下:

#include #include#include#include#include#include#include#include#include#include#include#include#include

#define DEVASHMEM "/dev/ashmem"

#define SHNAME "hellomemory"

#define MAXBUFSIZE 1024

#define TRANSFDCODE 1000

#define WRITEDATACODE 1001

using namespaceandroid;int g_sh_fd = 0;class MyBinderService : publicBBinder{

status_t onTransact(uint32_t code,const Parcel& data, Parcel*reply, uint32_t flags)

{intret;char *get_sh_addr_read =NULL;intget_sh_size;

printf("songsong!! **** onTransact ***** code = %d n",code);switch(code)

{caseTRANSFDCODE:

g_sh_fd=data.readFileDescriptor();

break;caseWRITEDATACODE:

get_sh_size=ioctl(g_sh_fd, ASHMEM_GET_SIZE,NULL);if(get_sh_size > 0)

{

get_sh_addr_read= (char*)mmap(NULL, get_sh_size, PROT_READ | PROT_WRITE, MAP_SHARED, g_sh_fd, 0);

}else{

printf("mmap failed %dn", get_sh_size);return -1;

}

printf("what is in the share memory: %sn", get_sh_addr_read);break;default:break;

}returnNO_ERROR;

}

};int main(int argc, char *argv[])

{

defaultServiceManager()->addService(String16("mybindertag"), newMyBinderService());

spproc(ProcessState::self());

ProcessState::self()->startThreadPool();

IPCThreadState::self()->joinThreadPool();return 0;

}

3.3

回收關閉部分代碼可選擇添加在mysharememory_b中,如下:

intret;

ret= munmap((void*)get_sh_addr_read, get_sh_size);if(ret == -1)

{return -1;

}

ret=close(g_sh_fd);if(ret == -1)

{return -1;

}

3.4

演示截圖:

4. 為了騙取評論,我不再解釋代碼,心累。不過您可以把代碼直接拷貝去編譯執行,再通過調試去理解代碼的精髓,也是沒問題的。

總結

以上是生活随笔為你收集整理的android 进程间的通信,Android native进程间通信实例-binder结合共享内存的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。