将数组转换为较小的数组

时间:2013-03-10 09:16:27

标签: java arrays

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

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

基本上我想做的是:

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

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

对任何解决方案的约束是两个数组必须指向相同的数组/内存。因此,只需将数组前半部分的副本创建为较小的数组就不是一种选择。

这样的事情可以通过WeakReference完成吗?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

如果失败,nio direct buffers是另一种在不复制的情况下在java和jni代码之间共享内存的方法。

答案 2 :(得分:0)

不是将你得到的图像存储在byte [1000]数组中,而是从一开始就将它存储在2字节[500]中,然后只需将你感兴趣的那个传递给你的原生函数。

你可以创建一个像

这样的辅助类
class MyImage {
    public byte[500] grayInfo;
    public byte[500] colorInfo;
}

由于数组长度不属于类型,因此在这里进行强制转换无法提供帮助。