我正在尝试将二维字符数组作为java代码中的参数,将其复制到C中的数组中,并在我的C代码中使用该数组,如下所示:
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 目前仅存储每个第二维数组的第一个值。我不确定如何让第二个for循环迭代这个维度并使用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 :(得分:0)
我可以看到至少两个问题:
您认为mapFromJava
是jcharArray
,但事实并非如此。如果Java类型为char[][]
,则相应的JNI类型为jobjectArray
,jobjectArray
中的每个元素都为jcharArray
。
您似乎认为char
和jchar
具有相同的尺寸,但他们可能不会这样做。 jchar
是无符号的16位整数类型。 char
通常是8位类型(尽管它可能因平台而异)。
我不知道那些神奇的数字19和9来自哪里。您应该使用GetArrayLength
返回的长度。
答案 1 :(得分:0)
如果参数mapFromJava
是2D字符数组,则它应该是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
}
答案 2 :(得分:0)
问题解决了,我忘记了mapArray将保存给定数组的所有元素,因此sizeof(char)需要足够大才能容纳数组中的所有字符。 例如(sizeof(char)* len2)