【发布时间】:2016-12-28 17:05:40
【问题描述】:
我正在使用 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);
问题是,参考文档,对于通过调用 PointerPointer<BytePointer>(...) 创建的每个 BytePointer 以及提供的数据,它不是内存包装,而是制作的副本。
有没有办法避免复制?
编辑:
否则,JNI 是否提供给予和回报byte[][]无需复制的解决方案? (我知道这是一个简单的byte[])
【问题讨论】:
-
如果内存和执行时间很关键并且无法避免原生,我会将更多代码转移到原生端......
-
@Fildor 是对的。我建议在 c++ 中而不是 java 中读取 byte[]。
-
@Both-of-you 当然你是对的,但不幸的是,我现在不能。
标签: java android memory java-native-interface javacpp