2016-04-25 3 views
0

Я пытаюсь сделать 2D массив символов в качестве аргумента из кода Java, скопировать его в массив в C и использовать массив в моем коде C, как показано ниже:2D Массивы в JNI

JNIEXPORT void JNICALL Java_Map_fillMap(JNIEnv *env, jobject thisObj, jcharArray mapFromJava) { 
    jsize len = (*env)->GetArrayLength(env, mapFromJava); 
    jchar *mapArray = (*env)->GetCharArrayElements(env, mapFromJava, 0); 
    int size = sizeof(char) * 19 * 9; 
    memcpy(map, mapArray, size); 

} Когда я пытаюсь распечатать массив 2d, я получаю по существу тарабарщину, которая, как представляется, из файла библиотеки DLL.

EDIT1 В настоящее время хранит только первое значение для каждого из массивов второго измерения. Im unsure о том, как получить второй цикл для итерации по этому измерению и скопировать каждый элемент с помощью memcpy.

JNIEXPORT void JNICALL Java_CGameLogic_fillMap(JNIEnv *env, jobject thisObj, jobjectArray 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 j; 
    for (j=0;j< len2; j++) { 
     memcpy(map[i], mapArray, sizeof(char)); 
    } 
    } 
} 
+0

Этот ответ, вероятно, поможет вам: http://stackoverflow.com/a/6752105/4756299 –

ответ

0

Есть по крайней мере две проблемы, которые я вижу:

  1. Вы предполагаете, что mapFromJava является jcharArray, но это не так. Если тип Java равен char[][], то соответствующий тип JNI будет jobjectArray, и каждый элемент в этом jobjectArray будет jcharArray.

  2. Вы считаете, что char и jchar имеют одинаковый размер, но, вероятно, нет. jchar - это неподписанный 16-разрядный целочисленный тип. A char обычно является 8-разрядным (хотя он может варьироваться в зависимости от платформы).

Я не знаю, откуда эти магические числа 19 и 9. Вы должны использовать длину, возвращаемую GetArrayLength.

0

Если параметр mapFromJava является двумерным символьным массивом, он должен быть jobjectArray. Затем каждый из его элементов равен char[]. Поэтому вам нужно перебрать элементы из mapFromJava, получить доступ к массиву 1D и добавить их элементы в вашу память.

jsize len = (*env)->GetArrayLength(env, mapFromJava); 
for(int i=0; i<len1; i++) { 
    jcharArray array = (jcharArray)env->GetObjectArrayElement(mapFromJava, i); 
    // extract the chars from array 
} 
0

Проблема решена, я забыл, что mapArray будет содержать все элементы для этого заданного массива, чтобы SizeOf (Char), необходимых, чтобы быть достаточно большим для всех символов в массиве. e.g (sizeof (char) * len2)