我希望能夠在我的Android應用程序中添加一點本機C代碼。我有一個IntBuffer,我用它作爲OpenGL的glColorPointer方法的參數。這是填充/使用這樣的事情:在Android遊戲中將java.nio.IntBuffer傳遞給C函數
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
上的內存操作到目前爲止,我想出了這一點:
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代碼時對其進行操作?
不同版本的Android之間的速度不同。更新版本的Dalvik核心庫具有更好的性能。 – fadden 2011-03-01 20:04:50