通过JNI传递数据数组的最快方法是什么

What is the fastest way to pass data arrays through the JNI?

本文关键字:方法 是什么 数组 JNI 数据 通过      更新时间:2023-10-16

我正在使用Oboe的本地代码开发一个Android应用程序。我在c++端生成数据,并需要将该数据绘制到自定义视图中。我还根据这些数据生成了Oboe的数据。

我也可以在Java端生成数据并将其传递给c++,然后从那里生成Oboe数据。这个应用程序不是实时的,但我想避免滞后。

我目前正在使用Set*ArrayRegion((将数据传递给Java,但这会复制数据。我真的只需要一个对数组的引用就可以对数据进行读取访问。NewDirectByteBuffer((会给我这样的访问权限吗?我需要访问数据以将其绘制到屏幕上,然后我可以取消引用。这行吗?还是我需要复制数组?阵列可以是从几千个元素以下到100000个元素以上的任何地方。1000-100000个元素可能是平均值。我担心表现。

使用Get*ArrayElements((将数据传递到c++会更快吗?医生说可以复制。我可以将数据传递给c++并从中生成双簧管数据。

似乎除非我使用NewDirectByteBuffer((,否则我最终会得到两个数据副本。这行得通吗?如果不行,Java到c++,或者c++到Java会更快吗?

首先,测量是否可以使用副本(通过Set*ArrayRegion(。这是迄今为止最简单的架构。

如果不能,Java和C++之间共享的直接字节缓冲区确实是最佳解决方案。请记住,创建直接字节缓冲区可能会很昂贵,所以尽量重用字节缓冲区(即保留一个池(,而不是创建新的字节缓冲区。