JNI层数组的处理

1.使用数组作为参数

JNIEXPORT void JNICALL
Java_org_davidliebman_android_awesomeguy_Panel_setTileMapData(JNIEnv * env, jobject  obj,
jintArray a_bitmap, jintArray b_bitmap, jintArray c_bitmap, jintArray d_bitmap)
{
  //jsize a_len = (*env)->GetArrayLength(env, a_bitmap);
  jint *a = (*env)->GetIntArrayElements(env, a_bitmap, 0);
  //jsize b_len = (*env)->GetArrayLength(env, b_bitmap);
  jint *b = (*env)->GetIntArrayElements(env, b_bitmap, 0);
  //jsize c_len = (*env)->GetArrayLength(env, c_bitmap);
  jint *c = (*env)->GetIntArrayElements(env, c_bitmap, 0);
  //jsize d_len = (*env)->GetArrayLength(env, d_bitmap);
  jint *d = (*env)->GetIntArrayElements(env, d_bitmap, 0);
  setTileMapData(a, b, c, d );
}

代码中传进去的jintArray类型需要进行转换才能给C/C++代码使用,其中GetArrayLength是获取数组长度,GetArrayElements是获取数组指针

JAVA端的代码就如下:

public native void setTileMapData( int [] a, int [] b, int [] c, int [] d);


2.返回类型是数组

JNIEXPORT jintArray JNICALL
Java_org_davidliebman_android_awesomeguy_Panel_drawLevel(JNIEnv * env, jobject  obj,
jint animate)
{
        int j,k;
        jint size = SCREEN_WIDTH * SCREEN_HEIGHT;
        jint fill[size]; 
        jintArray graphic;
        drawLevel(animate);
        graphic = (*env)->NewIntArray(env, size);
        if(graphic == NULL) {
                LOGE("ARRAY NOT CREATED");
                return NULL;
        }
        for (j = 0; j < SCREEN_HEIGHT; j++) {
                for (k = 0; k < SCREEN_WIDTH ; k ++ ) {
                        fill[ (j * SCREEN_WIDTH) + k ] = (jint) screen[j][k];
                }
        }
        
        
        (*env)->SetIntArrayRegion(env, graphic,0, size, fill);
        return graphic;
}


首先,在C/C++中使用数组来存储的数据,通过SetIntArrayRegion函数来转换成jintArray返回

JAVA端代码就这样:

public native int[] drawLevel(int num);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值