【问题标题】:2D C Arrays in JNIJNI 中的二维 C 数组
【发布时间】:2016-04-25 16:20:17
【问题描述】:

当我填充这个名为map[][] 的二维数组并尝试打印出存储在其中的所有值时,我在每个实际数组字符之后得到一个空字符。这不应该是这样,我希望mapFromJava 数组中的所有字符在 map 变量中的布局相同。

 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 是一个二维字符数组。 这是打印功能:

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

}

【问题讨论】:

  • map的类型是什么?应该是wchar_t**

标签: java c arrays java-native-interface 2d


【解决方案1】:

我不知道您如何确定存在额外的空字节,但请记住,jchar 是 16 位值,因为 java 字符是 UTF-16。这意味着 ASCII 范围内的字符将由空字节和 ASCII 字节组成。

更新 您的输出应存储为 wchar_t 而不是 char,因为 jchar 是 16 位值,而 C char 是 8 位。

【讨论】:

  • 当我打印出数组时,我会在存储在数组中的实际值之间打印一个空方字符。
  • @DSingh 所以你正在从 C 打印数组,使用类似 printf 的东西?我可以看看代码吗?正如 Jorn 所问,地图的类型是什么?如果您尝试将 UTF-16 字符打印为可以解释问题的常规 C 字符。
  • 地图是一个二维字符数组,我有一个全局变量。我在 JNI 中也有一个打印功能,可以在地图在 C 中填充后打印出来。EDIT 包含打印功能。
  • @DSingh 好的,那是你的问题。 jchar 是 16 位值,但 C 中的 char 是 8 位。您应该在地图上使用 wchar_t 而不是 char。
  • @DSingh 澄清一下,当您执行 memcpy 时,您将包含整个 16 位值,这就是您在 char 数组中获得空字节的原因。您需要使类型匹配或将 16 位 unicode 值转换为 8 位字符,如果您知道每个 16 位字符仅映射到 ASCII,这很容易,如果不是,则要复杂得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多