繁体   English   中英

JNI中的2D阵列

[英]2D Arrays in JNI

我试图将2D字符数组作为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));
     }
  }
}

我至少可以看到两个问题:

  1. 您假设mapFromJavajcharArray ,但事实并非如此。 如果Java类型为char[][]则对应的JNI类型为jobjectArray ,并且该jobjectArray中的每个元素都是jcharArray

  2. 您似乎假设charjchar具有相同的大小,但是它们可能不相同。 jchar是一个无符号的16位整数类型。 char通常是8位类型(尽管它可能因平台而异)。

我不知道那些魔术数字19和9来自何处。 您应该使用GetArrayLength返回的长度。

如果参数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
}

问题解决了,我忘记了mapArray将容纳该给定数组的所有元素,因此sizeof(char)需要足够大以容纳数组中的所有字符。 例如(sizeof(char)* len2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM