android JNI代码

时间:2017-03-24 16:39:16

标签: java android c java-native-interface

我有一个使用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代码后会崩溃。

编辑:我已经更新了这个列表。

1 个答案:

答案 0 :(得分:2)

您无法从Java发布数组。复制数据后需要调用ReleaseIntArrayElements-在主jni函数中的setTileMapData之后最简单。