JavaCPP如何避免数据拷贝?
How to deal with JavaCPP avoiding data copy?
我正在使用 JavaCPP 在 Java 应用程序中利用一些 C++ 库,但操纵的数据是大数据。所以我的代码工作正常但内存不友好(我需要它快速工作):
- 我有一个很大的
byte[][]
提供给原生部分
- 目标本机函数类似于
nativeFunction(PointerPointer param)
-> Doc
- (准确的说,这是预期的
PointerPointer<BytePointer>
类型,所以 BytePointer
的列表因为 byte[][]
是 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>(...)
使用提供的数据创建的,它不是内存包装,而是制作的副本。
有办法避免复制吗?
编辑:
否则,JNI 是否提供了 give AND return byte[][]
WITHOUT COPYING IT 的解决方案? (我知道这是一个简单的byte[]
)
我找到了解决办法,只是想分享一下。我将 byte[][]
替换为 ByteBuffer[]
(direct ByteBuffer
的数组)。然后,做
BytePointer bp = new BytePointer(/*direct ByteBuffer*/)
不复制!性能提升巨大!!
我正在使用 JavaCPP 在 Java 应用程序中利用一些 C++ 库,但操纵的数据是大数据。所以我的代码工作正常但内存不友好(我需要它快速工作):
- 我有一个很大的
byte[][]
提供给原生部分 - 目标本机函数类似于
nativeFunction(PointerPointer param)
-> Doc - (准确的说,这是预期的
PointerPointer<BytePointer>
类型,所以BytePointer
的列表因为byte[][]
是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>(...)
使用提供的数据创建的,它不是内存包装,而是制作的副本。
有办法避免复制吗?
编辑:
否则,JNI 是否提供了 give AND return byte[][]
WITHOUT COPYING IT 的解决方案? (我知道这是一个简单的byte[]
)
我找到了解决办法,只是想分享一下。我将 byte[][]
替换为 ByteBuffer[]
(direct ByteBuffer
的数组)。然后,做
BytePointer bp = new BytePointer(/*direct ByteBuffer*/)
不复制!性能提升巨大!!