2016-04-25 84 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