2016-04-25 85 views
1

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

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字符数组。 这是打印功能:

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

}

+0

'''map'''的类型是什么?它应该是'''wchar_t **'''。 –

回答

1

我不知道你是怎么确定有多余的空字节,但要记住一个jchar是一个16位的值作为Java的字符是UTF-16 。这意味着ASCII范围中的字符将由空字节和ASCII字节组成。

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

+0

当我打印出数组时,我在数组中存储的实际值之间打印出一个空的方块字符。 – Spod

+0

@DSingh所以你是从C打印数组,像printf?我能看到代码吗?正如Jorn所问,地图的类型是什么?如果您试图将UTF-16字符打印为可解释问题的常规C字符。 – bodangly

+0

该地图是我作为全局变量获取的2d字符数组。我还在JNI中获得了一个打印功能,可以在C中填充地图时将其打印出来。编辑包含打印功能。 – Spod