代码之家  ›  专栏  ›  技术社区  ›  Anil kumar

在JNI中将jchararray转换为jstring

  •  -1
  • Anil kumar  · 技术社区  · 7 年前

    我正在使用下面的JNI代码将jchararray转换为jstring,但在Linux中我只得到第一个字符。

     char *carr =(char*)malloc(length+1);
    (*env)->GetCharArrayRegion(env, ch, 0, length, carr);
    return  (*env)->NewStringUTF(env, carr);
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Antti Haapala -- Слава Україні    7 年前

    GetCharArrayRegion 返回Java字符,即。 UTF-16 代码点。和 jchar 在JNI中,它们不是以null结尾的,并且不能使用 NewStringUTF ,它需要一个以null结尾的字符串,该字符串包含 被改进的 UTF-8编码。

    首先,分配正确的内存量

    jchar *carr = malloc(length * sizeof(jchar));
    

    然后执行 GetCharArrayRegion

    (*env)->GetCharArrayRegion(env, ch, 0, length, carr);
    

    然后注意,您有一个UTF-16字符数组。如果第一个字符属于ASCII范围,并且体系结构是little endian,那么您只需要“获取第一个字符”,因为MSB 字节 第一 jchar 将为零,并且 纽斯特林格特 会认为这是终结者。使用 NewString 相反:

    return (*env)NewString(env, carr, length);
    
        2
  •  0
  •   Alex Cohn    7 年前

    你应该使用 新闻字符串() 所需的函数 jchar 数组及其长度。这个 NewStringUTF() 函数将UTF-8编码的C字符串作为输入。

    看见 https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html#zz-4.2 更多细节。