我正试图找出在Android上将大量(20Kb-2MB(数据从C++传递到Java的最佳方法。我正在使用Djinni来生成尽可能多的桥接代码。我正在考虑的选项是:
-
使用AHardwareBuffer-看起来像是围绕共享内存的抽象,主要用于EGL图像和其他GLES/Vulkan渲染需求,但可以在此处使用。我感到不安,因为";硬件";因为我没有与硬件接口。也许";硬件";这意味着这个内存可以安全地映射到设备,我的用例是也好吗?这个解决方案需要手工编写一些JNI代码。
-
让Java提供缓冲区-如果Java传递C++
bytes[]
,则不会复制数据,只复制数组的地址。这很麻烦,因为Java在分配缓冲区之前必须首先询问C++缓冲区应该有多大。这个解决方案可以使用自动生成的JNI代码。 -
使用NewDirectByteBuffer/java.nio.ByteBuffer.allocateDirect-没有引用的来源声称这是一个糟糕的选择,因为它很难管理,而且对少量数据表现不佳。不过这是谷歌推荐的。这个解决方案需要手工编写一些JNI代码。
我倾向于选项#2,因为它不需要手写任何JNI代码;足够好";。我还假设这种方法可以很好地反向工作(即,从Java到C++的缓冲区的无/低开销共享(。希望在原型设计/基准测试之前把你们所有人的想法都放在这里,这样做将是一项相当大的投资。
Snap的Djinni内置支持传递带有和不带有所有权语义的大型缓冲区。查看此链接了解详细信息:
https://github.com/Snapchat/djinni#exposing-使用dataview 跨越语言边界的数据