移动C ++内存而不复制

时间:2017-05-30 13:35:14

标签: java c++ java-native-interface move

目前我正在研究从C ++到Java的传输图像。

目标位置由Java分配,

源位置是C ++生成的图像,所以。

我有一个

uint8_t* pixelPtr

,我想将此内容移至

__uint8_t* data

没有副本。

我总共有1920 * 1080 * 3字节,所以我想移动而不是复制以便快速计算,我想知道是否有任何技巧方法可以做到这一点? 提前谢谢!

2 个答案:

答案 0 :(得分:2)

让我们回顾一下:

  • 源是由图像生成函数在C ++中分配的缓冲区。
  • 目标是某个其他代码在Java中用Java分配的缓冲区。
  • 您想在两个缓冲区之间传输数据。

只要这两个缓冲区是不同的,就没有"技巧"避免这种情况。 "移动"在这种情况下,将意味着交换指针,但这对底层缓冲区没有任何作用。您只需要复制数据。

首先探索解决方案,例如在目标缓冲区中生成数据,或者使用C ++映像生成函数(或Java代码)公开的适当功能。不幸的是,我们无法从这里推测这些解决方案的可能存在或形式。

答案 1 :(得分:1)

标准的方法是,你应该修改你的C ++代码,这样它就可以创建数据,而不是在任何地方,但是在给定的位置。也就是说,如果你有这样的代码

uint8_t* GenerateImage(...parameters...)
{
    uint8_t* output = ... allocate ...
    return output;
}

您应该将其更改为接收目的地作为参数

void GenerateImage(...parameters..., __uint8_t* destination)
{
    ... fill the destination ...
}

后者是更好的C ++设计 - 这样你就不需要创建一个单独的DestroyImage函数 - 内存完全由Java管理。