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



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

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 *"(又名"有符号字符 *"(的表达式初始化"无符号字符 *"会在指针之间转换为具有不同符号的整数类型 [-Wpointer-sign]

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

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

存在警告是因为符号更改可能很重要。在 JNI 中,jbyte对应于 Javabyte,它是一个有符号的 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("%cn", 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担心循环。

相关内容

最新更新