JNI中的2D C数组

时间:2016-04-25 16:20:17

标签: java c arrays java-native-interface 2d

当我填充这个名为map[][]的2d数组并尝试打印出存储在其中的所有值时,我会在每个实际数组字符后得到一个空字符。这不应该是这种情况,我希望mapFromJava数组中的所有字符在地图变量中都处于相同的布局中。

 JNIEXPORT void JNICALL Java_CGameLogic_fillMap(JNIEnv *env, jobject thisObj, jobjectArray mapFromJava) 
 {
      jsize len1 = (*env)->GetArrayLength(env, mapFromJava);
      int i;
      for(i=0; i<len1; i++) {
          jcharArray array = (*env)->GetObjectArrayElement(env,mapFromJava, i);
          int len2 =(*env)->GetArrayLength(env, array);
          jchar *mapArray = (*env)->GetCharArrayElements(env, array, 0);
          int size =  (sizeof(jchar) * len2);
          memcpy(map[i], mapArray, size);
     }
}

map是一个2d char数组。 这是打印功能:

    JNIEXPORT void JNICALL Java_CGameLogic_printMap(JNIEnv *env, jobject thisObj, jint mapHeight, jint mapWidth) {
int y;
int x;
for (y = 0; y < mapHeight; y++) {
    for (x = 0; x < mapWidth; x++) {
        printf("%c", map[y][x]);
    }
    printf("\n");
}

}

1 个答案:

答案 0 :(得分:1)

我不知道您是如何确定有额外的空字节,但请记住,jchar是16位值,因为java字符是UTF-16。这意味着ASCII范围内的字符将由空字节和ASCII字节组成。

<强>更新 您的输出应存储为wchar_t而不是char,因为jchar是16位值而C char是8位。