2013-03-10 89 views
1

我从存储在字节数组中的相机中获取图像。我将这个字节数组传递给本地函数。将阵列投射到更小尺寸的阵列

问题:图像包含原生函数不关心的颜色信息。黑/白信息位于阵列的前半部分。

所以基本上我想要做的是什么:

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

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

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

这样的事情可以用WeakReference来完成吗?

+0

我已经很长时间没有使用JNI了,但是你不能简单地将数组和索引传递给数组中哪些有意义的信息开始吗?然后本机代码只能制作相关部分的副本。 – 2013-03-10 09:21:03

回答

2

试试看你的jni代码中的GetByteArrayElements。根据JVM的实现,它要么复制数组,要么在Java内存中给你一个直接指向它的指针。我只用它与android,它确实给了我一个直接的指针,但我不知道它现在是否与HotSpot一起工作。

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

+0

我认为使用nio与直接缓冲区实际上是解决此问题的最佳解决方案。 – tmanthey 2013-03-10 13:10:07

0

不是将存储在byte [1000]数组中的图像存储起来,而是从一开始就将其存储在2个字节[500]中,然后将您感兴趣的那个存储到本机函数中。

你可以做一个辅助类像

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

,数组长度不是类型的一部分,铸造不禁在这里。

2

你似乎甚至没有考虑明显的答案,即将长度以及数组传递给本地方法。