gpt4 book ai didi

java - android JNI代码中的C内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-04 08:05:45 24 4
gpt4 key购买 nike

我有一个使用 android jni 的应用程序。在 Java 中我做这样的事情:

setTilemapData( a, b, c, d);

a、b、c 和 d 是包含我的 c 代码在 egl 1.0 屏幕上显示的位图信息的数组。函数 setTilemapData() 是我的 Panel 类中的 native 函数。这很好用。

首先在 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 代码后崩溃。

编辑:我已经更新了一些列表。

最佳答案

您永远不会从 Java 中释放数组。您需要在复制数据后调用 ReleaseIntArrayElements - 在主 jni 函数中的 setTileMapData 之后最简单。

关于java - android JNI代码中的C内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43004807/

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