C#byte[]到jbytearray,而不复制每个元素

本文关键字:复制 元素 jbytearray C#byte | 更新日期: 2023-09-27 18:22:41

我正在将一个字节数组从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);

但这种做法有多肮脏?

C#byte[]到jbytearray,而不复制每个元素

我认为这是复制数据的好方法。它唯一肮脏的地方是,用于pin_ptr的类型参数与用于arr的类型参数在文本上不同——不过没有真正的区别。

您省略了提供处理javaEnv的代码部分,因此请确保调用sendDocument的线程已使用JVM初始化和取消初始化(即使用AttachCurrentThreadDetachCurrentThread,或JNI_CreateJavaVMDestroyJavaVM)。