【问题标题】:How to deal with JavaCPP avoiding data copy?JavaCPP如何处理避免数据复制?
【发布时间】: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&lt;BytePointer&gt;(...) 创建的每个 BytePointer 以及提供的数据,它不是内存包装,而是制作的副本。

有没有办法避免复制?

编辑:

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

【问题讨论】:

  • 如果内存和执行时间很关键并且无法避免原生,我会将更多代码转移到原生端......
  • @Fildor 是对的。我建议在 c++ 中而不是 java 中读取 byte[]。
  • @Both-of-you 当然你是对的,但不幸的是,我现在不能。

标签: java android memory java-native-interface javacpp


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-05-19
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多