java - JNI 中的二维 C 数组

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

当我填充这个名为 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");
}

最佳答案

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

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

关于java - JNI 中的二维 C 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36845940/

相关文章:

java - 由于构建路径不完整,API 分析在 Eclipse 中中止

c - 使用 malloc() 和 realloc() 将字符串存储在数组中

php - 如何从 MySQL 表中对大型多维数组进行排序

c# - 为什么 File.WriteAllBytes 不适用于 .db 文件但适用于 .csv 文件?

Java在ubuntu上找不到文件

java - 使用 ProxyFactoryBean 时出现异常

c - getaddrinfo 不一致的行为

android - Android 上的 GStreamer

c++ - 在 C++ 运行时将 1D 数组(指针)视为 3D 矩阵

java - Spring - 为什么返回值在屏幕中显示 XML 类型?