我正在使用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*/)


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

09-13 01:40