2016-04-25 6 views
1

Wenn ich dieses 2d-Array mit der Bezeichnung map[][] fülle und versuche, alle darin gespeicherten Werte auszudrucken, bekomme ich nach jedem Array-Zeichen ein Nullzeichen. Dies sollte nicht der Fall sein. Ich möchte, dass alle Zeichen im Array mapFromJava im Layout der Map-Variablen enthalten sind.2D C Arrays in JNI

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

Karte ist eine 2d Char-Array. Diese ist die Druckfunktion:

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

Was ist der Typ von '' 'map''''? Es sollte wahrscheinlich '' 'wchar_t **' '' sein. –

Antwort

1

Ich weiß nicht, wie Sie bestimmt gibt es zusätzliches Null-Bytes, aber im Kopf behalten ein jchar ist ein 16-Bit-Wert als Java-Zeichen UTF-16 . Das bedeutet, dass Zeichen im ASCII-Bereich aus einem Null-Byte und dem ASCII-Byte bestehen.

aktualisieren Ihre Ausgabe als Wchar_t char nicht gespeichert werden sollte als jchar ein 16-Bit-Wert ist, und eine C char ist 8 Bits.

+0

Wenn ich das Array ausdrucke, bekomme ich ein leeres Quadratzeichen zwischen den tatsächlichen Werten, die in dem Array gespeichert sind. – Spod

+0

@DSingh Also druckst du das Array von C, mit etwas wie printf? Kann ich den Code sehen? Wie Jorn fragte, wie ist die Art der Karte? Wenn Sie versuchen, UTF-16-Zeichen als reguläre C-Zeichen auszugeben, die das Problem erklären würden. – bodangly

+0

Die Karte ist ein 2d Char-Array, das ich als globale Variable habe. Ich habe auch eine Druckfunktion in JNI, um die Karte auszudrucken, sobald sie in C ausgefüllt ist. EDIT enthält die Druckfunktion. – Spod