将字节数组引用从android java返回到csharp unity

时间:2019-07-18 18:20:37

标签: c# android unity3d

byte []个字节= Call(“ getBytes”);其中getBytes函数返回一个byte []。

上面的函数被调用以在csharp中获取图像rgb数据。返回的byte []被深深复制到bytes数组中。

由于返回字节数组很大,因此深度复制会增加时间。

如何在csharp中使bytes数组仅容纳Java byte []的引用?

1 个答案:

答案 0 :(得分:0)

AndroidJavaObject使用JNI(Java本机接口)来封送往返Java领域的数据。根据Java将数组存储在内存中的方式,JNI可能需要进行深度复制以形成C#可以理解的数组,例如JVM最初是否将数组存储在非连续块中。

这里是IBM's description

  

JNI在Java代码和本机代码之间提供了干净的接口。为了保持这种分离,将数组作为不透明的句柄传递,并且本机代码必须回调到JVM,以便使用set和get调用来操纵数组元素。 无论这些调用提供对数组的直接访问还是返回数组的副本,Java规范均由JVM实现决定。例如,当JVM优化数组时,它可能会以不连续存储的方式返回一个副本。

     

这些调用可能会导致复制被操纵的元素。例如,如果在具有1,000个元素的数组上调用GetLongArrayElements(),则可能导致分配和复制至少8,000个字节(1,000个元素*每个长8个字节)。然后,使用ReleaseLongArrayElements()更新数组的内容时,可能需要另一个8,000字节的副本来更新数组。即使使用更新的GetPrimitiveArrayCritical(),该规范仍允许JVM复制整个数组。

因此,基本上,尽量避免在整个JNI中编组数组(例如,尽可能地与AndroidJavaObject一起编组),因为取决于JNI是否进行深层复制取决于C#。