内存

摘要

函数

ASharedMemory_create(const char *name, size_t size)
int
创建共享内存区域。
ASharedMemory_dupFromJava(JNIEnv *env, jobject sharedMemory)
int
从给定的 Java android.os.SharedMemory 对象返回复制的文件描述符。
ASharedMemory_getSize(int fd)
size_t
获取共享内存区域的大小。
ASharedMemory_setProt(int fd, int prot)
int
限制对共享内存区域的访问。

函数

ASharedMemory_create

声明在 android/sharedmem.h
int ASharedMemory_create(
  const char *name,
  size_t size
)

创建共享内存区域。

创建共享内存区域并返回文件描述符。可以使用 mmap(2) 并结合 PROT_READ | PROT_WRITE | PROT_EXEC 将结果文件描述符映射到进程内存中。可以使用 ASharedMemory_setProt 限制对共享内存区域的访问。

使用 close(2) 释放共享内存区域。

使用 android.os.ParcelFileDescriptor 将文件描述符传递给另一个进程。文件描述符也可以通过 Unix 域套接字与 sendmsg(2) 和 SCM_RIGHTS 发送给其他进程。请参阅 sendmsg(3) 和 cmsg(3) 手册页了解更多信息。

如果您打算在调用 exec(3) 后将此文件描述符与子进程共享,请注意您需要使用 fcntl(2) 并结合 F_SETFD 清除 FD_CLOEXEC 标志,以便其在所有版本的 Android 上都能正常工作。

从 API 级别 26 开始提供。

详情
参数
name
可选名称。
size
共享内存区域的大小
返回值
表示共享内存的文件描述符;失败时返回 -1 并设置 errno,如果错误是大小为 0,则返回 -EINVAL

ASharedMemory_dupFromJava

声明在 android/sharedmem_jni.h
int ASharedMemory_dupFromJava(
  JNIEnv *env,
  jobject sharedMemory
)

从给定的 Java android.os.SharedMemory 对象返回复制的文件描述符。

返回的文件描述符与从 ASharedMemory_create() 返回的文件描述符具有所有相同的属性 & 功能,但保护标志将与 android.os.SharedMemory 对象的相同。

使用 close() 释放共享内存区域。

从 API 级别 27 开始提供。

详情
参数
env
JNIEnv* 指针
sharedMemory
Java android.os.SharedMemory 对象
返回值
表示共享内存的文件描述符;如果共享内存对象已关闭,如果 JNIEnv 或 jobject 为 NULL,或者如果打开的文件描述符过多 (errno=EMFILE),则返回 -1。

ASharedMemory_getSize

声明在 android/sharedmem.h
size_t ASharedMemory_getSize(
  int fd
)

获取共享内存区域的大小。

从 API 级别 26 开始提供。

详情
参数
fd
共享内存区域的文件描述符
返回值
大小(字节);如果 fd 不是有效的共享内存文件描述符,则为 0。

ASharedMemory_setProt

声明在 android/sharedmem.h
int ASharedMemory_setProt(
  int fd,
  int prot
)

限制对共享内存区域的访问。

此函数限制对共享内存区域的访问。访问只能被移除。此效果全局应用于系统中所有指向此共享内存区域的进程中的所有文件描述符。现有的内存映射区域不受影响。

常见的用例是创建共享内存区域,在本地将其映射为读/写模式以初始化内容,然后将该共享内存发送给另一个进程,并赋予只读访问权限。代码示例如下(省略了错误处理)。

int fd = ASharedMemory_create("memory", 128);

// By default it has PROT_READ | PROT_WRITE | PROT_EXEC.
size_t memSize = ASharedMemory_getSize(fd);
char *buffer = (char *) mmap(NULL, memSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

strcpy(buffer, "This is an example."); // trivially initialize content

// limit access to read only
ASharedMemory_setProt(fd, PROT_READ);

// share fd with another process here and the other process can only map with PROT_READ.

从 API 级别 26 开始提供。

详情
参数
fd
共享内存区域的文件描述符。
prot
任意按位或组合的 PROT_READPROT_WRITEPROT_EXEC,表示更新的访问权限。请注意,访问权限只能移除,不能添加回去。
返回值
成功时返回 0,失败时返回 -1 并设置 errno