1

我从存储在字节数组中的相机获取图像。我将此字节数组传递给本机函数。

问题:图像包含本机函数不关心的颜色信息。黑/白信息位于数组的前半部分。

所以基本上我想做的是:

byte[1000] image;
nativecall((byte[500])image);

这背后的原因是对 jni 函数的调用意味着我的图像的内存副本。如果我只通过图像的相关部分,我可以使用 30 fps 节省一些时间和内存。

任何解决方案的限制是两个数组必须指向相同的数组/内存。因此,简单地将数组的前半部分创建为较小的数组不是一种选择。

像这样的事情可以用 Wea​​kReference 完成吗?

4

3 回答 3

2

在您的 jni 代码中尝试GetByteArrayElements 。根据 JVM 实现,它要么复制数组,要么在 java 内存中为您提供指向它的直接指针。我只在android上使用它,它确实给了我一个直接的指针,但我不知道它现在是否适用于HotSpot。

如果失败,nio 直接缓冲区是在 java 和 jni 代码之间共享内存而无需复制的另一种方式。

于 2013-03-10T10:00:54.013 回答
2

您似乎甚至没有考虑过明显的答案,即将长度和数组传递给本机方法。

于 2013-03-10T09:46:49.243 回答
0

与其将获得的图像存储在 byte[1000] 数组中,不如从一开始就将其存储在 2 byte[500] 数组中,然后只需将您感兴趣的图像传递给您的本机函数即可。

您可以制作一个辅助类,例如

class MyImage {
    public byte[500] grayInfo;
    public byte[500] colorInfo;
}

由于数组长度不是类型的一部分,因此在这里强制转换无济于事。

于 2013-03-10T09:42:04.573 回答