我正在写一个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
以便signed
和unsigned 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
担心循环。