在我的RenderScript程序中,我想返回一个代表颜色的32位整数(在Java框架中直接是颜色),所以我这样做:
RS代码:
myrpm.rpm
myrpm-extra.rpm
myrpm-1.0.0_112233.noarch.rpm
myrpm-11.0.0_112233.noarch.rpm
myrpm-111.0.0_112233.noarch.rpm
myrpm-1.0_112233.noarch.rpm
myrpm-extra-1.0.0_112233.noarch.rpm
foo.yum
berayan.rpm
arun.yum
Toni.rpm
myrpm-1.0.0_112233.rpm
Java代码:
static const uchar k = 51;
static const uchar d = 5;
static int32_t histo[52][52][52];
....
int __attribute__((kernel)) getResult() {
int maximum = 0;
uchar3 vect = {0, 0, 0};
....
loops through histogram and puts max's coordinates into vect
...
// Convert coords back to [0, 255] space
vect.r = (uchar) (vect.s0*d + d/2);
vect.g = (uchar) (vect.s1*d + d/2);
vect.b = (uchar) (vect.s2*d + d/2);
return (0xff) << 24 | (vect.r & 0xff) << 16 | (vect.g & 0xff) << 8 | (vect.b & 0xff);
}
在使用x86模拟器时,它可以完美工作,但是由于某种原因,对于真实设备,Java端接收到的值是完全随机的。
如您所见,在.rs脚本中,alpha通道被硬编码为255(0xff),但是在Java端,该值根本不是255(102,164 ...)。
有人可以帮忙吗?谢谢
答案 0 :(得分:0)
好吧,这要感谢androidev reddit上的答案(谢谢@Izacus)。 首先:
vect.r & 0xff
和return语句中的其他剪切操作都无济于事,因为vect.r是uchar,它自身会环绕[0,255]范围。因此,为了避免混淆,我将该行更改为:
return 0xff << 24 | vect.r << 16 | vect.g << 8 | vect.b;
在面向多个平台时使用int
类型是危险的,请改用int32_t
。
因此,问题实际上出在按位运算中。 vect.r
,vect.g
和vect.b
是 unsigned 字符,当用|
运算符将它们加起来时,似乎会导致溢出或移位或其他原因创建一个带符号的32位整数。
要解决此问题,我将uchar3 vect;
更改为int3 vect;