将C代码转换为Java:指针

时间:2012-03-28 13:48:11

标签: java c

我知道我们无法在Java中安全地访问对象的地址,我们绝不应该尝试这样做。但我需要将此C代码转换为Java。值始终为8 bits大小。 C代码是这样的:

void merge(int value,unsigned short* outp, int x,int y, int width)
{
    unsigned char *outc;
    outc=(unsigned char *) outp + y*width +x;
    *outc=value;
} 

要将其转换为Java,我已将unsigned short* outp转换为short outp[]并将unsigned char* outc转换为short outc[]。然后我可以分配值。但我面临的问题是,当某个其他函数在循环中调用此函数时,每次都会增加宽度,并且只有一个字节被分配给特定的单元格。

我尝试了这个Java代码:

void merge(int value, int outp[], int x, int y, int width)
{

if(outp[y*width + x] >0)
   {    
        outp[y*width+x]=outp[y*width+x]<<8 +value;
   }
   else
   {
        outp[y*width+x]=value;
   }
}

我该怎么办?请帮忙。感谢。

4 个答案:

答案 0 :(得分:3)

java中没有指针的“可能”。它的引用与char等原始类型无关。

所以,在java中我们通常使用返回值的方法,而不是像C程序员那样通过指针返回值:

char merge(int value,int x,int y, int width) {
    char outchar;
    /// your code...
    return outchar;
}

答案 1 :(得分:0)

我不知道你的代码应该做什么。对我而言,它看起来只是将short的低位字节设置为给定值,并且java代码中的移位似乎不合适。由于你因某种原因用int []替换了short [],我不知道以下内容是否有用:

void merge(int value,short[] outp, int x,int y, int width){
   int address =  y*width +x;
   short temp = outp[address];
   temp &= 0xFF00;//keep the high order bits of the old value
   temp |= (short)(value & 0x00FF);//set the low order bits
   outp[address] = temp;

}

答案 2 :(得分:0)

您的C代码看起来像指针算术,用于在网格中的特定位置查找单元格的地址,然后在该位置设置值。

对于您的Java代码,我建议采用完全不同的方法。 您的调用代码用于网格的数据结构是什么? 您可以使用对网格进行建模的类,并包含setValue(x,y)方法。该类如何在内部对网格进行建模取决于您 - 它可以使用二维数组。

答案 3 :(得分:0)

作为一名试图将Java用于项目的C程序员,我当然可以认同您的困境。

要解决您的问题,我宁愿尝试以1D Java字节数形式访问您的2D数据。

这将使访问(row * col)字节变得微不足道,您将无需使用此包装代码(在循环中代价非常高)。

您是从Java还是从C分配数组取决于您的项目,但JNI调用使两种解决方案成为可能。

祝你好运!