2

我使用 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;

}

4

1 回答 1

0

我建议在打开(或创建)共享内存的类 ShmFactory 和提供读/写方法的 ShmAccess 之间进行协作。

interface ShmAccess
{
   void read( shmId, byte[] bytes );
   void write( shmId, byte[] bytes );
}

interface ShmFactory
{
   public native ShmAccess open( int shmId );
}
于 2012-10-19T16:13:28.373 回答