JNI和共享内存

时间:2012-08-15 09:41:24

标签: java c java-native-interface posix shared-memory

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

}

1 个答案:

答案 0 :(得分:0)

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

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

interface ShmFactory
{
   public native ShmAccess open( int shmId );
}