24

私の目的は、C ++プロセスからJavaプロセスにデータを渡し、結果を受け取ることです。

名前付きパイプを介してこれを実現しましたが、アクセスが高速であると想定して、データを渡したりコピーしたりするのではなく、データを共有したいと思います。

当初、Javaで読み書きできる共有セグメントをC ++で作成することを考えていましたが、これがJNIを介して可能かどうか、ましてや安全かどうかはわかりません。

JavaではByteBuffer.allocateDirectを使用してメモリを割り当て、GetDirectBufferAddressを使用してC ++のアドレスにアクセスすることは可能だと思いますが、正しければ、これはJNI内のネイティブ呼び出し用であり、C++プロセスでこのアドレスを取得できません。 ?

失った。

よろしくお願いします。

4

2 に答える 2

17

CreateFileMapping(Windows) や(Unix)などを使用してメモリを共有している場合、shmget必要なのは Java 側のネイティブ メソッドだけです。次に、次のように使用して、共有メモリに直接ByteBufferアクセスするを作成できます。NewDirectByteBuffer

JNIEXPORT jobject JNICALL Java_getSharedBuffer(JNIEnv* env, jobject caller) {
    void* myBuffer;
    int bufferLength;

次に、共有メモリへのポインタを取得する必要があります。Windows では、次のようなものを使用します。

    bufferLength = 1024; // assuming your buffer is 1024 bytes big
    HANDLE mem = OpenFileMapping(FILE_MAP_READ, // assuming you only want to read
           false, "MyBuffer"); // assuming your file mapping is called "MyBuffer"
    myBuffer = MapViewOfFile(mem, FILE_MAP_READ, 0, 0, 0);
    // don't forget to do UnmapViewOfFile when you're finished

ByteBufferこれで、この共有メモリに基づく を作成できます。

    // put it into a ByteBuffer so the java code can use it
    return env->NewDirectByteBuffer(myBuffer, bufferLength);
}
于 2013-03-14T17:20:46.517 に答える
4

JavaC++の両方をサポートし、より信頼性の高い0MQの使用を検討しましたか。Java で共有メモリを使用したい場合は、JNI を使用する必要があると思います。

これは、そのルートに行く場合はJNI経由で行う必要があることを示しています。私が見つけた解決策はWindows固有のものであり、あなたには当てはまらない場合があります.

于 2013-03-14T16:26:32.497 に答える