关闭

JNI层数组的处理

510人阅读 评论(0) 收藏 举报
分类:

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);



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:29555次
    • 积分:546
    • 等级:
    • 排名:千里之外
    • 原创:24篇
    • 转载:6篇
    • 译文:1篇
    • 评论:11条
    文章分类