【发布时间】:2013-07-25 15:56:49
【问题描述】:
我目前正在开发一个使用native C library. 的Android 应用程序我对C 非常不熟悉,并且遇到了一些转换问题。我知道这个问题与有符号/无符号数字有关,但无法弄清楚我需要做什么来解决这个问题。
C 库本身可以正常工作,并产生正确的结果。但是,当我将其移植回 Android 时,只有正值是正确的。负值返回为 256 减去该值。
例如:
8 -> 8
5 -> 5
1 -> 1
0 -> 0
-3 -> 253
-5 -> 251
-8 -> 248
这是 C 代码在赋值时的样子:
BYTE *parms;
WORD __stdcall GetValue(BYTE what, long *val){
char myStringParmsOne[255];
sprintf( myStringParmsOne, "parms[1]=%d", parms[1] );
LOG_INFO( myStringParmsOne );
char myStringIsG[255];
sprintf( myStringIsG, "API_isG=%d",API_isG );
LOG_INFO( myStringIsG );
char myStringCharParmsB[255];
sprintf( myStringCharParmsB, "(char)parms[1]=%d", (char)parms[1] );
LOG_INFO( myStringCharParmsB );
*val=(char)parms[1]-(API_isG?11:0);
}
LOG_INFO 语句将值打印到LogCat。下面我有程序运行时的值,预计值为-3。
The first **parms[1]=%d** statement returns **parms[1]=253**
The second **API_isG=%d** statement returns **API_isG=0**
The third **(char)parms[1]=%d** statement returns **(char)parms[1]=253**
BYTE 和 WORD 类型定义如下:
typedef unsigned char BYTE;
typedef unsigned short WORD;
我用来将此值发送回 Java 的包装函数如下所示:
long Java_my_package_Model_00024NativeCalls_GetValueJava( JNIEnv *env, jobject obj, WORD what) {
long c;
int j = GetValue( what, &c );
if( j == 0 ) {
return c;
} else {
return -1;
}
}
编辑
GetValue 方法一直在使用,但只有这个单独的调用给我带来了负数问题,它适用于其他调用。我已经为我的包装函数尝试了以下两件事:
long Java_my_package_Model_00024NativeCalls_GetValueJava( JNIEnv *env, jobject obj, WORD what) {
long c;
int j = GetValue( what, &c );
if( j == 0 ) {
return (signed char)c;
} else {
return -1;
}
}
上面的返回值的转换为我提供了一个正确的返回值。但是,对于其他值,对该函数的所有其他调用都是完全混乱的。
long Java_my_package_Model_00024NativeCalls_GetValueJava( JNIEnv *env, jobject obj, WORD what) {
long c;
int j = GetValue( what, &c );
if( j == 0 ) {
return (signed long)c;
} else {
return -1;
}
}
上面的返回值转换没有改变。
【问题讨论】:
-
那是因为
BYTE是无符号的,并且硬件使用二进制补码表示负数。 -
您能说出我们为哪种硬件架构构建您的应用程序吗?
-
@mathk 这是定制的,在公开市场上没有任何东西。
标签: c type-conversion unsigned