我有一个使用android jni的应用。在java中我做这样的事情:
setTilemapData( a, b, c, d);
a,b,c和d是包含我的c代码在egl 1.0屏幕上显示的位图信息的数组。函数setTilemapData()是我的Panel类中的本机函数。这很好。
首先在c中我做这样的事情:
static uint16_t tiles_a[16][16];
static uint16_t tiles_b[16][16];
static uint16_t tiles_c[16][16];
static uint16_t tiles_d[16][16];
然后,某处:
JNIEXPORT void JNICALL Java_some_package_Panel_setTileMapData(JNIEnv * env, jobject obj, jintArray a_bitmap, jintArray b_bitmap, jintArray c_bitmap, jintArray d_bitmap)
{
jint *a = (*env)->GetIntArrayElements(env, a_bitmap, 0);
jint *b = (*env)->GetIntArrayElements(env, b_bitmap, 0);
jint *c = (*env)->GetIntArrayElements(env, c_bitmap, 0);
jint *d = (*env)->GetIntArrayElements(env, d_bitmap, 0);
setTileMapData(a, b, c, d );
(*env)->ReleaseIntArrayElements(env, a_bitmap,a,NULL);
(*env)->ReleaseIntArrayElements(env, b_bitmap,b,NULL);
(*env)->ReleaseIntArrayElements(env, c_bitmap,c,NULL);
(*env)->ReleaseIntArrayElements(env, d_bitmap,d,NULL);
}
void setTileMapData(jint a[], jint b[], jint c[], jint d[] ) {
copyArraysExpand(a, TILEMAP_WIDTH * TILEMAP_HEIGHT, tiles_a);
copyArraysExpand(b, TILEMAP_WIDTH * TILEMAP_HEIGHT, tiles_b);
copyArraysExpand(c, TILEMAP_WIDTH * TILEMAP_HEIGHT, tiles_c);
copyArraysExpand(d, TILEMAP_WIDTH * TILEMAP_HEIGHT, tiles_d);
}
void copyArraysExpand (jint from[], int size_l, uint16_t to[TILEMAP_HEIGHT][TILEMAP_WIDTH]) {
int num, n, l;
int i,j, k;
for (i = 0; i< TILEMAP_HEIGHT; i ++ ) {
for (j = 0; j < TILEMAP_WIDTH; j ++ ) {
k =( i * TILEMAP_WIDTH ) + j;
if ( k < size_l ) {
to[i][j] = ( from[k]);
}
}
}
return;
}
//Later I use the data in tiles_a as a pattern which I copy to the screen (almost like a sprite or something)
在所有这些中的某个地方存在可怕的内存泄漏。我已经尝试过malloc空间并将其分配给tiles_a,以便稍后我可以释放它,但是ide会抱怨它是一个数组而且不能以这种方式分配。
该应用程序实际上在许多设备上运行,但在重复setTilemapData代码后会崩溃。
编辑:我已经更新了这个列表。
答案 0 :(得分:2)
您无法从Java发布数组。复制数据后需要调用ReleaseIntArrayElements-在主jni函数中的setTileMapData之后最简单。