我将一个字节数组从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);
但这种方法有多脏?
答案 0 :(得分:1)
我认为这是复制数据的好方法。关于它的唯一不好之处是你与pin_ptr
一起使用的类型参数在文本上与arr
使用的类型参数不同 - 但没有真正的区别。
您省略了提供javaEnv
处理的代码部分,因此请确保调用sendDocument
的线程已使用JVM进行初始化和未初始化(即使用AttachCurrentThread
和{{1} },或DetachCurrentThread
和JNI_CreateJavaVM
)。