我从相机中获取一个存储在字节数组中的图像。我将此字节数组传递给本机函数。
问题:图像包含本机功能不关心的颜色信息。黑/白信息位于数组的前半部分。
基本上我想做的是:
byte[1000] image;
nativecall((byte[500])image);
这背后的原因是调用jni函数意味着我的图像的记忆。如果我只传递图像的相关部分,我可以用30 fps节省一些时间和内存。
对任何解决方案的约束是两个数组必须指向相同的数组/内存。因此,只需将数组前半部分的副本创建为较小的数组就不是一种选择。
这样的事情可以通过WeakReference完成吗?
答案 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;
}
由于数组长度不属于类型,因此在这里进行强制转换无法提供帮助。