将4个uchar装箱为int时出现的问题(RenderScript)

时间:2019-01-09 18:45:10

标签: android c renderscript

在我的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 ...)。

有人可以帮忙吗?谢谢

1 个答案:

答案 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.rvect.gvect.b unsigned 字符,当用|运算符将它们加起来时,似乎会导致溢出或移位或其他原因创建一个带符号的32位整数。

要解决此问题,我将uchar3 vect;更改为int3 vect;