3

为了加快我的图像处理应用程序,我试图从中间开始处理数组中的值,并使用从 0 开始的索引。

例如,当我使用两个数组时,我经常会遇到这样的情况:

public void work(int[] array1, int[] array2, int offset)
{
    int len = array1.length;
    for (int i = 0; i < len; i++)
        array1[i] += array2[i + offset];
}

所以我想创建一个新变量array3,它直接映射到array2的中间(不是副本),所以我可以这样做:

public void work(int[] array1, int[] array2, int offset)
{
    int[] array3 = array2[offset]...;
    int len = array1.length;
    for (int i = 0; i < len; i++)
        array1[i] += array3[i];
}

实际上,我想要一个与此 c 语句等效的 Java:

int *array3ptr = array2ptr + offset;

注意:我对 JNI 或任何东西没有任何经验,所以如果归结为使用它,请提供工作示例。

4

3 回答 3

1

这不可能通过使用纯 Java 数组和array[index]符号来实现。在 Java 中,数组永远不能重叠

但是,您可以将数组包装在IntBuffer. 如果您使用直接缓冲区(请参阅 参考资料allocateDirect),您应该获得真正好的性能。

声明如

int *array3ptr = array2ptr + offset;

将被写为

IntBuffer array3 = array2.slice().position(offset);

这些

于 2012-05-14T08:56:08.870 回答
0

在java中,甚至整数数组也是堆上的对象。因此 int[] array2 实际上是直接引用内存中的整数数组。没有创建对象(即数组)的副本,副本只是对数组的引用。

于 2012-05-14T08:59:19.140 回答
0

我对它们没有太多经验,但我认为您可以通过将数组(和子数组)包装到IntBuffer实例中来做到这一点。

于 2012-05-14T09:01:29.247 回答