【问题标题】:Warning: while trying to convert java byte[] to C unsigned char*警告:尝试将 java byte[] 转换为 C unsigned char*
【发布时间】:2017-07-22 19:43:43
【问题描述】:

我正在编写一个 JNI。在那里,我的 Java 程序使用 ByteOutputStream() 获取一个 Image 字节数组,然后该数组用于调用 C 中的一个函数,该函数将字节数组转换为 unsigned 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]

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

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

【问题讨论】:

  • 尝试unsigned char* flag => signed char* flag 或显式转换指针(如果要打印,则只需使用带符号的字符)
  • 正如@Jean-FrançoisFabre 所写,使用signed char *。实际上,这也是警告告诉你的。错误消息和警告不仅仅是胡言乱语,它们通常确实有意义。这个告诉你你正在用signed char *初始化unsigned char *

标签: java c arrays java-native-interface


【解决方案1】:

存在警告是因为符号更改可能很重要。在 JNI 中,jbyte 对应于 Java byte,它是一个有符号的 8 位整数;在 C 中,它明确地是 signed char

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

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

或者,您可以将flag 声明为signed char

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

这对printf("%c\n", flag[i]); 很好,因为%c 要求参数是整数;然后将整数转换为unsigned char,因此signedunsigned char 都可以。

但是第三个选项是两者都不使用 - 如果您只想将它​​们写入终端,请使用 void * 指针和 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);     
}

fwrite 担心循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 2018-05-02
    • 2011-10-19
    • 2013-09-23
    • 1970-01-01
    • 2018-03-27
    相关资源
    最近更新 更多