我使用JNI访问先前创建的共享内存段。我使用Java / Jni读/写函数,它可以获取共享缓冲区的地址,也可以获取映射区域的id。
不幸的是,似乎每次调用读/写函数时我都必须使用下面的函数重新映射段。有没有办法绕过这个?我想(我已经尝试了这个,但它没有工作,只需要映射一次段,并且将来只使用void * addr参数,而不是每次我调用JNI方法读取或写,必须调用map_shared_memory。当前代码运行良好,但仍然相对较慢。因此希望最小化看似不必要的操作。
void* map_shared_memory(int id) {
void* addr;
if (id == 0)
return NULL;
addr = shmat(id, NULL, 0);
shmctl(id, IPC_RMID, NULL);
if(addr<=0)
perror("Error Mapping Shared Memory: ");
return addr;
}
答案 0 :(得分:0)
我建议在打开(或创建)共享内存的ShmFactory和提供读/写方法的ShmAccess之间进行协作。
interface ShmAccess
{
void read( shmId, byte[] bytes );
void write( shmId, byte[] bytes );
}
interface ShmFactory
{
public native ShmAccess open( int shmId );
}