// 如果是Android平台,且尚未定义_ANDROID_ASHMEM_H,则定义它 #ifdef __ANDROID__ #ifndef _ANDROID_ASHMEM_H #define _ANDROID_ASHMEM_H // 包含所需的头文件 #include #include // 包含ashmem相关的ioctl操作 #include #include #include // 包含内存映射函数 // 如果Android API级别大于或等于26(Android 8.0),则使用Bionic的shm*函数 #if __ANDROID_API__ >= 26 #define shmat bionic_shmat #define shmctl bionic_shmctl #define shmdt bionic_shmdt #define shmget bionic_shmget #endif #include // 包含标准的共享内存函数 #undef shmat #undef shmctl #undef shmdt #undef shmget // 取消对Bionic函数的重定义 #include // 定义ashmem设备的路径 #define ASHMEM_DEVICE "/dev/ashmem" // 定义shmctl函数的封装,用于删除共享内存 static inline int shmctl(int __shmid, int __cmd, struct shmid_ds* __buf) { int ret = 0; if (__cmd == IPC_RMID) { int length = ioctl(__shmid, ASHMEM_GET_SIZE, NULL); struct ashmem_pin pin = { 0, length }; ret = ioctl(__shmid, ASHMEM_UNPIN, &pin); close(__shmid); } return ret; } // 定义shmget函数的封装,用于创建共享内存 static inline int shmget(key_t __key, size_t __size, int __shmflg) { (void)__shmflg; int fd, ret; char ourkey[11]; fd = open(ASHMEM_DEVICE, O_RDWR); if (fd < 0) return fd; sprintf(ourkey, "%d", __key); ret = ioctl(fd, ASHMEM_SET_NAME, ourkey); if (ret < 0) goto error; ret = ioctl(fd, ASHMEM_SET_SIZE, __size); if (ret < 0) goto error; return fd; error: close(fd); return ret; } // 定义shmat函数的封装,用于将共享内存附加到进程地址空间 static inline void* shmat(int __shmid, const void* __shmaddr, int __shmflg) { (void)__shmflg; int size; void* ptr; size = ioctl(__shmid, ASHMEM_GET_SIZE, NULL); if (size < 0) { return NULL; } ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, __shmid, 0); if (ptr == MAP_FAILED) { return NULL; } return ptr; } #endif /* !_ANDROID_ASHMEM_H */ #endif /* !__ANDROID__ */