Java 将数组强制转换为较小大小的数组
我从相机中得到一个图像,存储在字节数组中。我将这个字节数组传递给一个本机函数 问题:图像包含本机函数不关心的颜色信息。黑白信息位于阵列的前半部分 所以基本上我想做的是:Java 将数组强制转换为较小大小的数组,java,arrays,Java,Arrays,我从相机中得到一个图像,存储在字节数组中。我将这个字节数组传递给一个本机函数 问题:图像包含本机函数不关心的颜色信息。黑白信息位于阵列的前半部分 所以基本上我想做的是: byte[1000] image; nativecall((byte[500])image); 这背后的原因是对jni函数的调用意味着我的映像的memcopy。如果我只通过图像的相关部分,以30 fps的速度我可以节省一些时间和内存 任何解决方案的约束条件都是两个数组必须指向同一个数组/内存。因此,简单地将数组的前半部分复制到
byte[1000] image;
nativecall((byte[500])image);
这背后的原因是对jni函数的调用意味着我的映像的memcopy。如果我只通过图像的相关部分,以30 fps的速度我可以节省一些时间和内存
任何解决方案的约束条件都是两个数组必须指向同一个数组/内存。因此,简单地将数组的前半部分复制到较小的数组中是不可取的
像这样的事情可以用WeakReference来完成吗?不要将得到的图像存储在字节[1000]数组中,而是从一开始就将其存储在2字节[500]数组中,然后将感兴趣的图像传递给本机函数 您可以创建一个助手类,如
class MyImage {
public byte[500] grayInfo;
public byte[500] colorInfo;
}
由于数组长度不是该类型的一部分,因此在这里强制转换也无济于事。与其将获得的图像存储在字节[1000]数组中,不如从一开始就将其存储在2字节[500]数组中,然后将感兴趣的图像传递给本机函数 您可以创建一个助手类,如
class MyImage {
public byte[500] grayInfo;
public byte[500] colorInfo;
}
由于数组长度不是该类型的一部分,因此在这里强制转换也无济于事。您似乎甚至没有考虑明显的答案,即将长度和数组传递给本机方法。您似乎甚至没有考虑明显的答案,将长度和数组传递给本机方法。尝试在jni代码中使用。根据JVM实现,它要么复制数组,要么在java内存中为您提供指向数组的直接指针。我只在android上使用过它,它确实给了我一个直接的指针,但我不知道它现在是否可以在HotSpot上使用 如果失败了,还有另一种方法可以在java和jni代码之间共享内存,而无需复制。请尝试在jni代码中添加内存。根据JVM实现,它要么复制数组,要么在java内存中为您提供指向数组的直接指针。我只在android上使用过它,它确实给了我一个直接的指针,但我不知道它现在是否可以在HotSpot上使用
如果失败,是java和jni代码之间共享内存而无需复制的另一种方法。我很久没有使用jni了,但是你不能简单地传递数组和数组中重要信息开始的索引吗?本机代码只能复制相关部分。我已经很长时间没有使用JNI了,但是你不能简单地在数组中传递数组和索引,其中包含有意义的信息开始吗?本机代码只能复制相关部分。我认为使用nio和直接缓冲区实际上是解决此问题的最佳方案。我认为使用nio和直接缓冲区实际上是解决此问题的最佳方案。