我正在使用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是否提供无需复制就给予并返回
byte[][]
的解决方案? (我知道这是一个简单的byte[]
) 最佳答案
我找到了一个解决方案,只想分享它。我用byte[][]
(直接ByteBuffer[]
的数组)替换了ByteBuffer
。然后,做
BytePointer bp = new BytePointer(/*direct ByteBuffer*/)
不复制!性能提升巨大!!