gpt4 book ai didi

android - 使用 Android NDK SharedMemory.h 进行多进程

转载 作者:行者123 更新时间:2023-11-28 04:30:39 32 4
gpt4 key购买 nike

我一直在 Android Studio(使用 NDK)中尝试多处理(使用共享内存)。我安装了 NDK、LLDB、CMake。我还使用 API 级别 26,最小 SDK 也是 26(OREO,8.0)。

我创建了 native_lib.cpp,并制作了一些用于测试 FD 的文件。

我做了简单的小类测试。

类有 int FileDescriptor,char* 缓冲区。

我检查了变量,看起来成功了。 ASharedMemory_Create() 返回 fd,我可以从 ASharedMemory_getSize(int fd) 获取内存大小。

但是我怎样才能从另一个进程访问共享内存呢?我需要为 IPC 使用 java 吗?如果可以的话,我只想使用 native 。目前 java 仅用于 UI。

https://developer.android.com/ndk/reference/group/memory

我在这里查看。如果有值得我引用的东西,请告诉我。谢谢。

已编辑---------------------------------------- --------

我想在 parent 和 child 中共享内存。也想自由访问共享内存。 child 对 child , child 对 parent , parent 对 child 。

在父级中创建文件描述符和缓冲区工作顺利,但是当我尝试在子级中创建缓冲区或 fd 时,我无法访问它。

我为 ASharedMemory_create 使用了相同的名称和大小,但我认为其他进程生成不同的文件描述符。不知道怎么了。

下面是我用来测试的native_lib.cpp。除了 Init 之外,与 Buttons 匹配的函数。 Init 调用了 onCreate。

int fd[4];
char* buffer[4];

int myFd;
int* cBuf;

const char* names[4] = {"Test", "Inter", "Process", "Mech"};
const int size = 512;

extern "C" JNIEXPORT void JNICALL
Java_org_techtwon_multipro_MainActivity_SyncBuffer(
JNIEnv *env,
jobject /* this */) {
int cVal;
memcpy(&cVal, cBuf, sizeof(int));

for(int i = 0 ; i < cVal; ++i)
{
if(fd[i] != NULL) {
buffer[i] = (char *) mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd[i], 0);
}
}
}

extern "C" JNIEXPORT void JNICALL
Java_org_techtwon_multipro_MainActivity_MakeFileDesc(
JNIEnv *env,
jobject /* this */) {

pid_t pid = fork();
int cVal;

if(pid < 0) {
return;
} else if(pid == 0) {
memcpy(&cVal, cBuf, sizeof(int));

fd[cVal] = ASharedMemory_create(names[cVal], size);
buffer[cVal] = (char*) mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd[cVal], 0);

memset(buffer[cVal], 0, size);
memcpy(buffer[cVal], names[cVal], strlen(names[cVal]));

cVal++;
memcpy(cBuf, &cVal, sizeof(int));

sleep(1);
exit(1);
}
}

extern "C" JNIEXPORT void JNICALL
Java_org_techtwon_multipro_MainActivity_Init(
JNIEnv *env,
jobject /* this */) {
myFd = ASharedMemory_create("Num", sizeof(int));
cBuf = (int*) mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_SHARED, myFd, 0);

for(int i = 0 ; i < 4; ++i) fd[i] = ASharedMemory_create(names[i], size);

buffer[0] = (char*) mmap(NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_SHARED, fd[0], 0);
memcpy(buffer[0], names[0], strlen(names[0]));

memset(cBuf, 0, sizeof(int));
}

extern "C" JNIEXPORT jint JNICALL
Java_org_techtwon_multipro_MainActivity_GetFd(
JNIEnv *env,
jobject /* this */, jint idx) {
return fd[idx];
}

extern "C" JNIEXPORT jbyteArray JNICALL
Java_org_techtwon_multipro_MainActivity_GetBuffer(
JNIEnv *env,
jobject /* this */, jint idx) {

jbyteArray tmp = (*env).NewByteArray(strlen(buffer[idx]));

env->SetByteArrayRegion(tmp, 0, strlen(buffer[idx]), (jbyte*) buffer[idx]);

return tmp;
}

extern "C" JNIEXPORT jint JNICALL
Java_org_techtwon_multipro_MainActivity_GetcVal(
JNIEnv *env,
jobject /* this */, jint idx) {

int cVal;
memcpy(&cVal, cBuf, sizeof(int));

return cVal;
}

最佳答案

official docs中的代码 fragment 已经很清楚了:

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

// By default it has PROT_READ | PROT_WRITE | PROT_EXEC.
char *buffer = (char *) mmap(NULL, 128, 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 should use对于 API 29 及更高版本,旧方法(下方)don't work anymore .

如果您还需要涵盖 API 26 以下的设备,则需要一个回退,它可以将 IOCTL 直接指向 /dev/ashmem 文件描述符。这在 Android 早期就可用:

#include <fcntl.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <linux/ashmem.h>

int fd = open("/dev/ashmem", O_RDWR);

ioctl(fd, ASHMEM_SET_NAME, "memory");
ioctl(fd, ASHMEM_SET_SIZE, 128);

char *buffer = (char * ) mmap(NULL, 128, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

甚至有一个包装此共享内存以便在 Java 中使用的很好的示例: ANDROID – CREATING SHARED MEMORY USING ASHMEM .

关于android - 使用 Android NDK SharedMemory.h 进行多进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53058077/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com