gpt4 book ai didi

java - 在 Java 和 C 之间发送 int[]s

转载 作者:搜寻专家 更新时间:2023-10-30 19:52:49 26 4
gpt4 key购买 nike

我在 Android 中有一些图像处理 Java 代码,它们作用于两个大的 int 数组。大多数时候,Java 足够快,但我需要通过 JNI 和 NDK 使用 C 来加速一些操作。

我知道我可以将数据从 int 数组传递到 C 的唯一方法是使用 ByteBuffer.allocateDirect 创建一个新缓冲区,将数据复制到该缓冲区,然后使 C 代码对缓冲区进行操作。

但是,我看不出有任何方法可以在 Java 中操作此缓冲区中的数据,就像缓冲区是 int[] 或 byte[] 一样。例如,对 ByteBuffer.array() 的调用将在新创建的缓冲区上失败。有什么方法可以使它起作用吗?

我的内存有限,想减少我需要的数组/缓冲区的数量。例如,如果我可以使用 IntBuffer.wrap(new int[...]) 创建缓冲区,然后直接在 Java 中操作支持缓冲区的数组,那会很好,但我不能这样做,因为唯一似乎在这里为 JNI 工作的是 ByteBuffer.allocateDirect。

还有其他方法可以在C和Java之间来回发送数据吗?我能以某种方式在 C 端分配内存并让 Java 直接将数据发送到那里吗?

编辑:比较缓冲区使用与 int[] 使用的基准:

int size = 1000;
IntBuffer allocateDirect = java.nio.ByteBuffer.allocateDirect(4 * size).asIntBuffer();
for (int i = 0; i < 100; ++i)
{
for (int x = 0; x < size; ++x)
{
int v = allocateDirect.get(x);
allocateDirect.put(x, v + 1);
}
}

int[] intArray = new int[size];
for (int i = 0; i < 100; ++i)
{
for (int x = 0; x < size; ++x)
{
int v = intArray[x];
intArray[x] = v + 1;
}
}

在 Droid 手机上,缓冲区版本需要大约 10 秒才能完成,而阵列版本需要大约 0.01 秒。

最佳答案

来自 http://java.sun.com/docs/books/jni/html/objtypes.html , 使用 JNI 的 Get/Release<TYPE>ArrayElements(...)

在这个例子中,我将传递一个数组(为了参数的缘故,它是 int array = new int[10] 然后用 0-9 填充它

 JNIEXPORT jint JNICALL 
Java_IntArray_doStuffArray(JNIEnv *env, jobject obj, jintArray arr)
{

// initializations, declarations, etc
jint *c_array;
jint i = 0;

// get a pointer to the array
c_array = (*env)->GetIntArrayElements(env, arr, NULL);

// do some exception checking
if (c_array == NULL) {
return -1; /* exception occurred */
}

// do stuff to the array
for (i=0; i<10; i++) {
c_array[i] = i;
}

// release the memory so java can have it again
(*env)->ReleaseIntArrayElements(env, arr, c_array, 0);

// return something, or not.. it's up to you
return 0;
}

学习第 3.3 节,特别是第 3.3.2 节——这将允许您获取指向 java 内存中数组的指针,修改它并释放它,实际上允许您在 native 代码中修改数组。

我刚刚在我自己的项目中使用它(使用短数组)并且效果很好:)

关于java - 在 Java 和 C 之间发送 int[]s,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4841345/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com