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);
但这种做法有多肮脏?
我认为这是复制数据的好方法。它唯一肮脏的地方是,用于pin_ptr
的类型参数与用于arr
的类型参数在文本上不同——不过没有真正的区别。
您省略了提供处理javaEnv
的代码部分,因此请确保调用sendDocument
的线程已使用JVM初始化和取消初始化(即使用AttachCurrentThread
和DetachCurrentThread
,或JNI_CreateJavaVM
和DestroyJavaVM
)。