- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我希望能够在我的 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/
谷歌没有找到答案,所以我来问 static float vertices_textures[] = { //vertices //positions
我正在使用 : 读取整数文件 int len = (int)(new File(file).length()); FileInputStream fis = new FileInputStream(f
我想在 Java 中分配一个直接 IntBuffer,比如说 10 亿个元素(64 位系统)。我知道的唯一方法是创建一个直接 ByteBuffer 并将其视为直接 IntBuffer。但是,4*1,0
所以我有一大堆我必须处理的整数(大约 70Mb)。作为阅读过程的一部分,我需要暂时存储它们。我可以将它们分布在多个 IntBuffer 上,或者分配几个大数组。 但是,我找不到任何关于 IntBuff
每当我运行以下代码时,java 在释放 IntBuffer 时都会返回 EXCEPTION_ACCESS_VIOLATION: public int[] size(){ IntBuffer s
我在 IntBuffer 中有图像的 RGB 数据,并希望通过绘画将其显示在 JPanel 上。最有效的方法是什么? 编辑 目前我通过以下代码将数据绘制到 BufferedImage 上,但想知道是否
abstract class IntBuffer 似乎无论如何都无法创建此类的实例,因为它声明为抽象,但同时,还有一个静态工厂方法IntBuffer allocate(intcapacity) 现在您
正如标题所说,它想要创建一个由特定(已经存在的)IntBuffer 支持的 BufferedImage。 到目前为止,我有以下代码: final IntBuffer buf = ...; DataBu
我有以下代码: IntBuffer DrawBuffers = Utils.createIntBuffer(2); int bfs[] = {GL30.GL_COLOR_ATTACHMENT0
在使用堆外缓冲区时,可能需要将它们复制到数组中。假设我们不知道缓冲区是关闭还是在堆上。如何填写执行? IntBuffer b = ... // could be off or on -heap int
在大多数 Android 设备上,如果我用整数而不是 float 进行所有 OpenGL 顶点计算/渲染,我是否应该期待性能提升? 我最近从使用 0:width, 0:height 而不是 -1:1,
我试图获取一组 mipmaplevels 并将其保存到本地缓存文件,以避免每次都重建它们(并且预先生成它们是不切实际的......) 我已经将 mipmaplevels 放入了一组位图中,现在想将它们
我正在开发一个 Android 应用程序(显然是用 Java 编写的)并且我最近更新了我的 UDP 阅读器代码。在这两个版本中,我都设置了一些缓冲区并接收了一个 UDP 数据包: byte[] buf
我知道一个快速的方法,可以将byte/short/int/long数组转换成ByteBuffer,然后得到一个字节数组。例如,要将字节数组转换为短数组,我可以这样做: byte[] bArray =
我有三个代码 fragment ,它们的行为应该相似,也可能不是,我仍在研究 OpenGL ES 如何与 Android 的 Java 绑定(bind)。但是我真的很想知道为什么 fragment B
我希望能够在我的 Android 应用程序中添加一些 native C 代码。我有一个 IntBuffer 用作 OpenGL 的 glColorPointer 方法的参数。这是填充/使用这样的东西:
这里还有其他关于此主题的问题,其中大部分涉及 ByteBuffer 和 asIntBuffer。但是,我还没有看到任何关于如何在转换为 IntBuffer 时防止值被截断的解释。 例子: byte[]
我最近在 Badlogicgames.com 上阅读了一篇关于加速将信息添加到顶点缓冲区(或任何其他 intbuffer)的过程的文章,它确实提高了我的项目速度,但我不太明白 "Noticing th
我上周开始使用 OpenGL 3.3+,在尝试让索引绘图工作时遇到了这个问题。现在,我只是尝试使用 IBO 绘制一个三角形。 索引缓冲区和indexHandle: int[] tIndices = {
我是一名优秀的程序员,十分优秀!