gpt4 book ai didi

android - 在 Android 游戏中将 java.nio.IntBuffer 传递给 C 函数

转载 作者:太空狗 更新时间:2023-10-29 13:41:29 24 4
gpt4 key购买 nike

我希望能够在我的 Android 应用程序中添加一些 native C 代码。我有一个 IntBuffer 用作 OpenGL 的 glColorPointer 方法的参数。这是填充/使用这样的东西:

private IntBuffer mColourBuffer;
int[] colours = new int[10 * 4]; // 10 dots, 4 colour components per dot


ByteBuffer vbb3 = ByteBuffer.allocateDirect(10 * 4 * 4);
vbb3.order(ByteOrder.nativeOrder());
mColourBuffer = vbb3.asIntBuffer();
mColourBuffer.put(colours);
mColourBuffer.position(0);

gl.glColorPointer(4, GL10.GL_FIXED, 0, mColourBuffer);

我想更改这个缓冲区,但它在 Java 中太慢了,所以我想用 native 代码来做。我一直在寻找一个简单的例子,但我找不到任何我能理解或有效的东西。我看过的很多文档都在谈论传递元素,但我想要的只是一个指针。传递一个指针并对它指向的内存进行操作应该是非常高效的;在 Java 和 C 之间传递内存负载会扼杀通过从 C 操作内存可能带来的任何速度改进。

到目前为止,我已经想到了这个:

void Java_com_poldie_myTouch2_myclass_mymethod( JNIEnv* env, jobject thiz, jintArray arr, int n )
{
jint *c_array;

c_array = (*env)->GetIntArrayElements(env, arr, NULL);

(*env)->ReleaseIntArrayElements(env, arr, c_array, 0);


return;


}

我可以这样调用:

public native void  mymethod(IntBuffer intbuf, int n);

mymethod(mColourBuffer , n);

它至少运行并且似乎执行了调用,但是任何对 c_array 进行操作的尝试(作为取消引用的指针或数组)都会导致程序立即退出。

我走在正确的轨道上吗?我可以将指向 mColourBuffer 后面的内存的指针传递给我的 C 代码并在返回到我的 Java 代码时对其进行操作吗?

最佳答案

在这里回答我自己的问题,答案似乎是获取您的顶点数组(您正在使用 Java 处理每个帧)并将它们写入直接缓冲区。

在我上面的示例中,我想以某种方式在每一帧中使用本地数组“颜色”中的任何内容填充直接缓冲区 mColourBuffer。结果你想要这样的东西:

JNIfastPutf(mfColourBuffer, colours, nCount); 

其中 nCount 是要复制的字节数。 (Native, C) 函数 JNIfastPutf 如下所示:

void Java_com_a_b_c_JNIfastPutf(JNIEnv* env, jobject thiz, jobject jo, jfloatArray jfa, int n)
{
float* pDst = (float*) (*env)->GetDirectBufferAddress(env, jo);
float* pSrc = (float*) (*env)->GetPrimitiveArrayCritical(env, jfa, 0);
memcpy( pDst, pSrc, n );

(*env)->ReleasePrimitiveArrayCritical(env, jfa, pSrc, 0);
}

我发现以下链接非常有用(我的函数是他们的 C++ 示例的略微修改的 C 版本):

http://www.badlogicgames.com/wiki/index.php/Direct_Bulk_FloatBuffer.put_is_slow

他们解释说,如果您正在使用 float ,您确实需要这种方法;使用 int 据说要快得多,尽管那是我开始的地方,并且无论如何,他们的 native 代码显示在 20 -> 100% 的范围内速度比“快速”int 版本增加,所以似乎没有什么理由不要这样做!

关于android - 在 Android 游戏中将 java.nio.IntBuffer 传递给 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5122841/

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