0

C# から Java にバイト配列を渡しています。現在、私の C++ コードは次のようになっています。

sendDocument(array<byte> ^arr) //Called by C# class
{ ...
    jbyteArray result = javaEnv->NewByteArray(arr->Length);
    jbyte *bytes = javaEnv->GetByteArrayElements(result, 0);
    for(int k = 0; k < arr->Length ; k++)
    {       
        bytes[k] = arr[k];
    }
    ... //Call Java method
}

どういうわけかコピー部分を省略できますか (または別の方法でパフォーマンスを向上させますか)?

編集: ポインタ作業でなんとかやり遂げました:

jbyteArray result = javaEnv->NewByteArray(arr->Length);
pin_ptr<unsigned char> pUnmanagedArr = &arr[0];
javaEnv->SetByteArrayRegion(result, 0, arr->Length, (jbyte*)pUnmanagedArr);

しかし、このアプローチはどれほど汚れていますか?

4

1 に答える 1

1

これは、データをコピーするための良いアプローチだと思います。唯一汚いのは、 で使用した型パラメーターが、 で使用しpin_ptrた型パラメーターとテキスト的に同じではないということですarr— ただし、実際の違いはありません。

deal with を提供するコード セクションを省略したjavaEnvため、呼び出すスレッドがsendDocumentJVM で初期化および初期化解除されていることを確認してください (つまり、AttachCurrentThreadand DetachCurrentThread、またはJNI_CreateJavaVMandを使用DestroyJavaVM)。

于 2013-07-17T14:42:46.700 に答える