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

问题描述

预期输出

enter image description here

  • 我想创建一个Jchar数组,该数组的大小基于用户输入的大小。

  • 如何将输入值存储到jchar数组?

  • 例如,第一个输入为“ A”,第二个输入为“ S”。

  • 我想将值'A'存储到array [0],将'S'存储到array [1]。

  • 基于下面的代码,我无法将值存储到jchar数组。

    代码:

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,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语言角度来看,这些语法的主要问题是h修饰符不适用于%c字段。但是,您似乎在为Java char和C char之间的差异而作更大的努力。前者是16位无符号数据类型,通常被解释为包含UTF-16代码单元。后者是一种8位或更多位(但可能是8位)的可能带符号的数据类型,其到抽象字符的映射取决于(C-)实现。

如果我们可以简化假设

  1. 您的C实现使用与ASCII兼容的运行时字符编码(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数组中,并根据输入的实际编码,例如通过{{3},通过适用的Java方法之一将其转换为char数组。 }。当然,即使两个假设都成立,您也可以这样做。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...