Java JNI与共享内存

Java JNI与共享内存,java,c,java-native-interface,posix,shared-memory,Java,C,Java Native Interface,Posix,Shared Memory,我使用JNI访问以前创建的共享内存段。我使用一个Java/Jni读/写函数,它可以获取共享缓冲区的地址,也可以获取映射区域的id 不幸的是,似乎每次调用读/写函数时,我都必须使用下面的函数重新映射段。有什么办法绕过这件事吗?我想要(我已经尝试过这个方法,但它不起作用,只需映射一次段,以后只需使用void*addr参数,而不是每次调用JNI方法读或写时,都必须调用map_shared_内存。当前代码运行良好,但速度相对较慢。因此希望尽量减少看似不必要的操作美国 void* map_shared_m

我使用JNI访问以前创建的共享内存段。我使用一个Java/Jni读/写函数,它可以获取共享缓冲区的地址,也可以获取映射区域的id

不幸的是,似乎每次调用读/写函数时,我都必须使用下面的函数重新映射段。有什么办法绕过这件事吗?我想要(我已经尝试过这个方法,但它不起作用,只需映射一次段,以后只需使用void*addr参数,而不是每次调用JNI方法读或写时,都必须调用map_shared_内存。当前代码运行良好,但速度相对较慢。因此希望尽量减少看似不必要的操作美国

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;
void*映射共享内存(int-id){
无效*地址;
如果(id==0)
返回NULL;
addr=shmat(id,NULL,0);
shmctl(id,IPC\u RMID,NULL);

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

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

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

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

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

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

嗯,你试过这个了吗?谢谢,但不幸的是,使用外部库并不是一个真正的选择。为什么每次访问都要重新映射内存?换句话说,是什么破坏了它?我还没有试过,它可能也解决不了你的问题,但我认为应该有可能实现共享memor可作为一个组件提供给Java。从JNI返回到Java,再从Java返回到JNI时,该段似乎正在被破坏。你知道为什么吗?谢谢,新的DirectByteBuffer看起来很有希望。不幸的是,我使用的是信号量,所以必须在JNI/C级别进行同步。我看不出该段为什么要这样做被销毁。也许你可以使用
strace
来验证这一点,如果真的发生了,使用一些调试器来定位代码中发生这种情况的位置。据我所知,JVM甚至不应该知道关于该段的任何信息,所以它应该没有理由篡改它。嗯,你试过这个了吗?谢谢,但是unf很可能,使用外部库并不是一个真正的选项。为什么每次访问都要重新映射内存?换句话说,是什么破坏了它?我还没有尝试过这个方法,它可能也不能解决您的问题,但我假设应该可以将此共享内存作为当从JNI返回到Java,再从Java返回到JNI时,段会被破坏。你知道为什么吗?谢谢,新的DirectByteBuffer看起来很有希望。不幸的是,我使用的是信号量,所以必须在JNI/C级别进行同步。我看不出段会被破坏的原因。也许你可以使用
strace
为了验证这一点,如果真的发生了,请使用一些调试器来定位代码中发生这种情况的位置。据我所知,JVM甚至不应该知道有关该段的任何信息,因此它应该没有理由篡改它。