在Android游戏中向C函数传递java.nio.IntBuffer

 2023-01-20    339  

问题描述

我希望能够在我的Android应用程序中添加一个本机的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相比太慢了,所以我想用本机代码进行操作.我一直在寻找一个简单的例子,但是我找不到任何可以理解或有效的东西.我看过的很多文档都谈论传递元素,但我想要的只是指针.传递指针并在指向其指向的内存上操作应该非常有效;在Java和C之间传递内存负载将杀死C.

在Android游戏中向C函数传递java.nio.IntBuffer

的内存,可能会杀死任何速度的改进.

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

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是要复制的字节数. (本机,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/wiki/index.php/direct_bulk_floatbuffer.put_is_is_slow” rel=” rel=” rel =”rel =”rel =”rel = htttp://wwwwwwwwwwwwwwwwwwwwwww.badlogicgame.com.com.com.phiki/indindex.phpp/direct_bulk_floatbuffer.put_is_slow

他们解释说,如果您正在使用浮子,您确实需要这种方法;据说使用ints要快得多,尽管那是我开始的地方,无论如何,它们的本机代码在20-> 100%速度的区域中显示出比”快速” INT版本的速度,因此似乎几乎没有原因不这样做!

以上所述是小编给大家介绍的在Android游戏中向C函数传递java.nio.IntBuffer,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/25919.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。