1

我正在使用 JavaCPP 在 Java 应用程序中利用一些 C++ 库,但操作的数据是大数据。所以我的代码工作正常,但对内存不友好(我需要它快速工作):

  • 我有很多东西byte[][]要提供给原生部分。
  • 目标本机函数类似于nativeFunction(PointerPointer param)-> Doc
  • (准确地说,这是一种PointerPointer<BytePointer>预期的类型,因此BytePointerasbyte[][]的列表是 的列表byte[])-> Doc

我以这种方式初始化预期的参数:

byte[][] myBigDatas;
// myBigDatas.length = 4
// myBigDatas[x].length = something like 4000000

// Initialize param
PointerPointer<BytePointer> srcParam = new PointerPointer<BytePointer>(
    myBigDatas[0],
    myBigDatas[1],
    myBigDatas[2],
    myBigDatas[3]);

// Call the native function
nativeFunction(srcParam);

问题是,参考文档,对于通过使用提供的数据BytePointer调用创建的每个PointerPointer<BytePointer>(...),它不是内存包装,而是制作的副本。

有没有办法避免复制?

编辑:

byte[][] 否则,JNI 是否提供无需复制即可提供和返回的解决方案?(我知道这是一个简单的byte[]

4

1 回答 1

0

我找到了一个解决方案,只是想分享它。我byte[][]用(一个直接ByteBuffer[]数组)替换了我的。然后,做 ByteBuffer

BytePointer bp = new BytePointer(/*direct ByteBuffer*/)

不复制!性能提升巨大!!

于 2016-10-04T12:54:59.020 回答