当前位置: 首页 > 知识库问答 >
问题:

将无符号字符数组转换为jstring

程仲卿
2023-03-14

我在尝试将未签名的 char 数组转换为 jstring 时遇到问题。

上下文是我正在使用来自Java的共享c库。所以我正在实现一个JNI c文件。我在库中使用的函数会恢复无符号 char* num_carte_transcode

我在 JNI C 文件中实现的函数返回一个 jstring。

所以我需要把无符号的char数组转换成jstring。

但是,尽管数组应该只包含20个字节,但我在Java中随机得到22或23个字节......(虽然 20 个字节是正确的)

编辑1:这里有一些更详细的例子

JNIEXPORT jstring JNICALL Java_com_example_demo_DemoClass_functionToCall
  (JNIEnv *env, jobject, ) {
  // Here I define an unsigned char array as requested by the library function
  unsigned char unsigned_char_array[20];
  // The function feeds the array at execution
  function_to_call(unsigned_char_array);

  // I print out the result for debug purpose
  printf("result : %.*s (%ld chars)\n", (int) sizeof unsigned_char_array, unsigned_char_array, (int) sizeof unsigned_char_array);

  // I get the result I want, which is like: 92311221679609987114 (20 numbers)

  // Now, I need to convert the unsigned char array to jstring to return to Java
  return (env)->NewStringUTF((char*) unsigned_char_array);
  // Though... On debugging on Java, I get 21 bytes 92311221679609987114 (check the image below)
}

有时我得到22个字节,有时得到23个字节...尽管预期结果始终为 20 个字节。

共有1个答案

柴赞
2023-03-14

传递给< code>NewStringUTF的字符串必须以null结尾。但是,您传递的字符串不是以null结尾的,看起来在第一个null之前的字符串末尾有一些垃圾。

我建议创建一个更大的数组,并在末尾添加一个空终止符:

JNIEXPORT jstring JNICALL Java_com_example_demo_DemoClass_functionToCall
  (JNIEnv *env, jobject recv) {
  unsigned char unsigned_char_array[20 + 1]; // + 1 for null terminator
  function_to_call(unsigned_char_array);    
  unsigned_char_array[20] = '\0'; // add null terminator

  printf("result : %s (%ld chars)\n", unsigned_char_array, (int) sizeof unsigned_char_array);

  return (env)->NewStringUTF((char*) unsigned_char_array); // should work now
}
 类似资料:
  • 我想优化我的代码,避免错误,我有这个功能,但我认为我可以改善和避免内存问题。 该函数的思想是接收这种样式的字符串“0123456789”并将其传递给0x01、0x23、0x45、...在无符号字符数组中。任何提示,良好的实践或改进将是非常有用的。 用法是这样的: 在函数缓冲区中结束如下:

  • Í 具有需要返回 J 字节数组的 JNI 函数。该数组包含带有数据的 c 结构的字节数据。但是当我将数据从未编号的char数组传递到jbyte数组时,我遇到了错误。 C结构定义如下: JNI方法定义如下: 我得到的错误是: jni/帮助器函数.cpp:44:38: 错误: 不匹配 '运算符 =' 在 '*(数组 ((无符号的整数)索引)) = SendData.打包发送::字节 [索引]' 我的问

  • 问题内容: 在Java中,是否有一种简单而优雅的方法将无符号字节值转换为有符号字节值?例如,如果我所拥有的只是int值240(二进制(24位+ 11110000)= 32bits),如何获得该int的带符号值? 问题答案: 除了,Java没有其他无符号值。考虑以下代码段: 结果将为-1,因为最低的8位已复制到byte变量中。

  • 我有这样一个字符串: 和一个数组: 我想制作这个: 我试着用sscanf(),但我做不到。

  • 我有一个购物车php页面,在那里我显示客户端产品。在同一页中,我有一个表单,可以将客户的个人详细信息(如姓名、姓氏等)以及产品信息(如产品名称、数量等)直接发送到我的电子邮件地址。 现在,问题是,当我发送表单时,在我的电子邮件地址上,我收到了所有的信息,但没有产品细节,例如在订单电子邮件中的产品名称字段,我有ARRAY。 我看到将数组转换为字符串时出现问题,但我不知道如何转换,我尝试了几个示例,但

  • 我正在使用Schembuf在带有套接字的计算机之间更改数据。要传输数据,我使用以下内容: 然而,我注意到Protobuf无法读取任何非int类型的接收数据(它将其分配给0)。果不其然,如果我不使用套接字,但试图用相同的代码片段返回消息,则会发生相同的情况: 我还指出: 那么,为什么我不能正确地将数据转换回字符串呢?如果这是一个参考问题,为什么protobuf不能读取字符数组数据或从字符数组转换的字