如何检索用户输入值并将其存储到 C (JNI) 中的 jchar 数组?

How to retrieve user input value and store it to jchar array in C (JNI)?

预期输出

JNIEXPORT jcharArray JNICALL Java_array_getArrayCharacter(JNIEnv *env, jobject obj){       
    int i, size;
    jchar array[size];
    //array size
    printf("Enter Size of Array : ");
    scanf("%d",&size);
    //User input Character
    printf("\n--User Defined Character--\n");
    for (i = 0; i < size; i++) {
        printf("Input %d: ",i+1);
        scanf("%hc", &array[i]);
    }

    //Display array
    for (i = 0; i < size; i++){
        printf("%hc\n", array[i]);
    }

    //create new array with the given length
    jcharArray result = (*env)->NewCharArray(env, size);

    // update the new created array result
    (*env)->SetCharArrayRegion(env, result, 0, size, array);

    return result;      
}

问题似乎围绕着这个...

    for (i = 0; i < size; i++) {
        printf("Input %d: ",i+1);
        scanf("%hc", &array[i]);
    }

...也许还有这个:

    //Display array
    for (i = 0; i < size; i++){
        printf("%hc\n", array[i]);
    }

从 C-language 的角度来看,这些的主要问题是 h 修饰符不适用于 %c 字段。但是您似乎更普遍地在 Java char 和 C char 之间的差异上挣扎。前者是 16 位无符号数据类型,通常被解释为包含 UTF-16 代码单元。后者是 8-or-more-bit(但可能是 8),maybe-signed 数据类型,其到抽象字符的映射是 (C-) 实现相关的。

如果我们可以做出以下简化假设

  1. 您的 C 实现使用 ASCII-compatible 运行时字符编码(UTF-8、Windows 1252 或任何 ISO 8859 系列等),并且
  2. 您不需要支持(7 位)ASCII 范围之外的字符

那么答案就比较简单了。您读取类型为 (C) char 的数据,然后通过隐式转换或强制转换在它和 jchar 之间来回转换。例如,

    for (i = 0; i < size; i++) {
        char c;
        printf("Input %d: ",i+1);
        scanf("%c", &c);
        array[i] = c;                     // implicit conversion across the assignment
    }

    for (i = 0; i < size; i++){
        printf("%c\n", (char) array[i]);  // explicit conversion via cast
    }

注意:这可能会正确地将输入 (C) 字符回显到输出,即使这两个假设都不成立。

但是,如果上述任何一个假设都不成立,那么您将需要处理字符编码问题,以便 Java 将 char 数组解释为包含与 C 解释其相同的字符输入来表示。然后,您可能希望将输入读入 jbyte 数组,并根据输入的实际编码,通过适用的 Java 方法之一执行到 char 数组的适当转换,例如通过CharsetDecoder。当然,即使这两个假设都成立,您也可以这样做。