2

JNI を使用して、以前に作成した共有メモリ セグメントにアクセスします。共有バッファーのアドレスまたはマップされた領域の ID を取得できる Java/Jni 読み取り/書き込み関数を使用します。

残念ながら、読み取り/書き込み関数を呼び出すたびに、以下の関数を使用してセグメントを再マップする必要があるようです。これを回避する方法はありますか?(私はこれを試しましたが、うまくいきませんでした。JNI メソッドの読み取りまたは書き込みを呼び出すたびに、セグメントを 1 回だけマップし、将来は void* addr パラメーターを使用するだけで済みます) , 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 に答える