Android调用C++实现共享内存(Native层)

您所在的位置:网站首页 跨进程调用函数 Android调用C++实现共享内存(Native层)

Android调用C++实现共享内存(Native层)

2023-08-26 07:26| 来源: 网络整理| 查看: 265

Android下匿名共享内存java层接口利用MemoryFile实现进程间内存共享;利用MemoryFile可以参考这篇文章:https://blog.csdn.net/qq_24451593/article/details/80514566

MemoryFile是java层封装的接口,它实现共享内存主要调用了如下函数:

int fd = open("/dev/ashmem",O_RDWR); ioctl(fd, ASHMEM_SET_NAME,name); ioctl(fd,ASHMEM_SET_SIZE, size); //addr为共享内存地址 addr = (char*)mmap(NULL, size , PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

创建出来的fd转换成ParcelFileDescriptor通过AIDL传递给另一个进程;另一个进程将ParcelFileDescriptor转换成该进程对应fd,调用mmap来使用该共享内存。 注:进程A的fd与进程B的fd是不一样的,但是都对应同一文件 在这里插入图片描述

既然知道了MemoryFile实际调用函数,那么我们就可以在native层用C++代码实现共享内存。

(1)C++代码实现

android_shm.cpp

#include "android_shm.h" #define ASHMEM_DEVICE "/dev/ashmem" //ret= 0 创建成功;ret=-1,失败; //注:ret =1,共享内存已经存在,但是目前这个没用,暂时放这 int create_shared_memory(const char* name, U64 size, int node, char*& addr, U64& shm_id){ U64 fd = open(ASHMEM_DEVICE, O_RDWR); if(fd < 0){ return -1; } U64 len = ioctl(fd, ASHMEM_GET_SIZE, NULL); if(len > 0){ addr = (char*)mmap(NULL, size , PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); shm_id = fd; return 1; }else{ int ret = ioctl(fd, ASHMEM_SET_NAME,name); if(ret < 0){ close(fd); return -1; } ret = ioctl(fd,ASHMEM_SET_SIZE, size); if(ret < 0){ close(fd); return -1; } addr = (char*)mmap(NULL, size , PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); shm_id = fd; } return 0; } int open_shared_memory(const char* name, int node, char*& addr, U64& shm_id){ U64 size = ioctl(shm_id, ASHMEM_GET_SIZE,NULL); if(size > 0){ addr = (char*)mmap(NULL, size , PROT_READ | PROT_WRITE, MAP_SHARED, shm_id, 0); }else{ return -1; } return 0; } int close_shared_memory(U64& shm_id, char*& addr){ U64 size = ioctl(shm_id, ASHMEM_GET_SIZE, NULL); if(size


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3