通过 JNI 传递数据数组的最快方法是什么?
What is the fastest way to pass data arrays through the JNI?
我正在使用 Oboe 的本机代码开发 Android 应用程序。我在 C++ 端生成数据,需要将该数据绘制到自定义视图。我还从该数据中为双簧管生成了数据。
我还可以在 Java 端生成数据并将其传递给 c++,然后从那里生成双簧管数据。该应用程序不是实时的,但我想避免延迟。
我目前正在使用 Set*ArrayRegion() 将数据传递给 Java,但会复制数据。我真的只需要引用数组来读取数据。 NewDirectByteBuffer() 会给我这样的访问权限吗?我需要访问数据以将其绘制到屏幕上,然后我可以废弃引用。那行得通还是我需要复制阵列?数组可以是从少于几千个元素到超过 10 万个元素的任何地方。 1000-100,000 个元素可能是平均的。我担心性能。
使用 Get*ArrayElements() 将数据传递到 c++ 会更快吗?文档说它可以复制。我可以将数据传递给 C++ 并从中生成双簧管数据。
似乎除非我使用 NewDirectByteBuffer(),否则我将得到两个数据副本。不过,这会起作用吗?如果不起作用,Java 到 c++ 或 c++ 到 Java 会更快吗?
首先,衡量一下您是否可以接受副本(通过 Set*ArrayRegion)。这是迄今为止最简单的架构。
如果不能,Java 和 C++ 之间共享的直接字节缓冲区确实是最佳解决方案。请记住,创建直接字节缓冲区的成本可能很高,因此请尽量重用字节缓冲区(即保留一个池)而不是创建新字节缓冲区。
我正在使用 Oboe 的本机代码开发 Android 应用程序。我在 C++ 端生成数据,需要将该数据绘制到自定义视图。我还从该数据中为双簧管生成了数据。
我还可以在 Java 端生成数据并将其传递给 c++,然后从那里生成双簧管数据。该应用程序不是实时的,但我想避免延迟。
我目前正在使用 Set*ArrayRegion() 将数据传递给 Java,但会复制数据。我真的只需要引用数组来读取数据。 NewDirectByteBuffer() 会给我这样的访问权限吗?我需要访问数据以将其绘制到屏幕上,然后我可以废弃引用。那行得通还是我需要复制阵列?数组可以是从少于几千个元素到超过 10 万个元素的任何地方。 1000-100,000 个元素可能是平均的。我担心性能。
使用 Get*ArrayElements() 将数据传递到 c++ 会更快吗?文档说它可以复制。我可以将数据传递给 C++ 并从中生成双簧管数据。
似乎除非我使用 NewDirectByteBuffer(),否则我将得到两个数据副本。不过,这会起作用吗?如果不起作用,Java 到 c++ 或 c++ 到 Java 会更快吗?
首先,衡量一下您是否可以接受副本(通过 Set*ArrayRegion)。这是迄今为止最简单的架构。
如果不能,Java 和 C++ 之间共享的直接字节缓冲区确实是最佳解决方案。请记住,创建直接字节缓冲区的成本可能很高,因此请尽量重用字节缓冲区(即保留一个池)而不是创建新字节缓冲区。