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

时间:2013-07-17 09:57:52

标签: c# java-native-interface c++-cli

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

但这种方法有多脏?

1 个答案:

答案 0 :(得分:1)

我认为这是复制数据的好方法。关于它的唯一不好之处是你与pin_ptr一起使用的类型参数在文本上与arr使用的类型参数不同 - 但没有真正的区别。

您省略了提供javaEnv处理的代码部分,因此请确保调用sendDocument的线程已使用JVM进行初始化和未初始化(即使用AttachCurrentThread和{{1} },或DetachCurrentThreadJNI_CreateJavaVM)。