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

警告:试图将java字节[]转换为C无符号字符*时

胡光霁
2023-03-14

我在写JNI。在这种情况下,我的Java程序使用ByteOutputStream()获取一个图像字节数组,然后用这个数组调用C中的一个函数,将字节数组转换为无符号char*。代码如下:

JNIEXPORT void JNICALL Java_ImageConversion_covertBytes(JNIEnv *env, jobject obj, jbyteArray array) 
 {
    unsigned char* flag = (*env)->GetByteArrayElements(env, array, NULL);
    jsize size = (*env)->GetArrayLength(env, array);

    for(int i = 0; i < size; i++) {
    printf("%c", flag[i]);}
 }

在这一点上,当我编译时,我不断收到警告:

警告:使用“jbyte *”类型的表达式(也称为“signed char *”)初始化“unsigned char *”会在指向具有不同符号[-Wpointer-sign]的整数类型的指针之间进行转换

无符号字符* flag = (*env)-

如何删除此警告?我想打印所有的字符。

共有1个答案

谭坚诚
2023-03-14

警告之所以存在,是因为符号更改可能很重要。在JNI,< code>jbyte对应于Java byte,它是一个有符号的8位整数;在C #中,它是显式< code >带符号字符。

但是,可以使用任何字符指针访问任何对象,因此您可以显式转换为无符号 char

unsigned char* flag = (unsigned char*)(*env)->GetByteArrayElements(env, array, NULL);

或者,您可以将< code>flag声明为< code >有符号字符:

signed char* flag = (*env)->GetByteArrayElements(env, array, NULL);

这对于< code>printf("%c\n ",flag[i])来说没有问题;因为< code>%c要求参数为整数;然后,整数被转换为< code >无符号字符,因此< code >有符号字符和< code >无符号字符都可以。

然而,第三种选择是两者都不使用——如果您只想将它们写入终端,请使用< code>void *指针和< code>fwrite:

JNIEXPORT void JNICALL 
Java_ImageConversion_covertBytes(JNIEnv *env, jobject obj, jbyteArray array) 
{
    void *flag = (*env)->GetByteArrayElements(env, array, NULL);
    jsize size = (*env)->GetArrayLength(env, array);
    fwrite(flag, 1, size, stdout);     
}

并让担心循环。

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

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

  • 我在尝试将未签名的 char 数组转换为 jstring 时遇到问题。 上下文是我正在使用来自Java的共享c库。所以我正在实现一个JNI c文件。我在库中使用的函数会恢复 我在 JNI C 文件中实现的函数返回一个 jstring。 所以我需要把无符号的char数组转换成jstring。 但是,尽管数组应该只包含20个字节,但我在Java中随机得到22或23个字节......(虽然 20 个字节

  • 问题内容: 我想在GO中将字符串数组转换为字节数组,以便可以将其写到磁盘上。将字符串数组()解码为字节数组()的最佳解决方案是什么? 我正在考虑对字符串数组进行两次迭代,第一个迭代以获得字节数组所需的实际大小,然后第二个迭代写入每个元素的长度和实际字符串()。 解决方案必须能够以其他方式进行转换;从一个到一个。 问题答案: 让我们忽略一个事实,那就是走一秒钟。您需要做的第一件事是将序列化格式编组为

  • 如何将字符串(字节字符串)转换为字节(字节字符串),而不必手动复制和粘贴字符串并在其前面放置b?