1

我正在使用渲染脚本。我想将数组的元素传递给渲染脚本,并希望对渲染脚本中的每个元素执行平方并将数据返回到 android 框架工作。

我正在尝试通过以下代码来做到这一点。

1.java代码 2.RS代码

但是通过这些代码,这件事是不可能的。请你告诉我我用这些代码做了什么错误。

==================================================== ===========================

爪哇代码

  public class SUM extends Activity {


private int[] input;
private int[] output;
private RenderScript mRS;
private Allocation mInAllocation;
private Allocation mOutAllocation;
private ScriptC_Sum mScript;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    input= new int[4];
    input[0]=0;
    input[1]=1;
    input[2]=2;
    input[3]=3;

    output =new int[4];

    createScript();
}


private void createScript() {

    mRS = RenderScript.create(this);

    mInAllocation    = Allocation.createSized(mRS, Element.U32(mRS),4);
    mOutAllocation   = Allocation.createTyped(mRS,mInAllocation.getType());
    mScript = new ScriptC_Sum(mRS, getResources(), R.raw.sum);

    mScript.bind_v_in(mInAllocation);
    mScript.bind_v_out(mOutAllocation);

    mScript.invoke_square(mInAllocation,mOutAllocation);


}
}

==================================================== ========= RS 代码

#pragma version(1)
#pragma rs java_package_name(com.cdacb.mars.summation)

#include "rs_types.rsh"
#include "rs_graphics.rsh"
#include "rs_core.rsh"

int32_t *v_in ;
int32_t *v_out;

 void square(){

}

void root(int32_t *v_in,int32_t *v_out )
{

   square();

 }
4

1 回答 1

1

几件事:

1-我发现您的 .rs 文件不能与您的 .java 文件同名

2- 您在根函数 (*v_out) 上声明了一个输出变量,但从未在函数内部计算它。

3-你的java数组都是整数。从Renderscript API上的幂函数声明来看,它们都至少需要一个浮点数作为输入

这是我的java代码:

    public class Sum extends Activity {
    private float[] input;
    private float[] output;
    private RenderScript mRS;
    private Allocation mInAllocation;
    private Allocation mOutAllocation;
    private TextView t1;
    private ScriptC_Square mScript;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sum);
        t1= new TextView(this);
        t1= (TextView)findViewById(R.id.textview1);

        input= new float[4];
        input[0]=0;
        input[1]=1;
        input[2]=2;
        input[3]=3;
        output =new float[input.length];
        createScript();
    }

    private void createScript() {
        mRS = RenderScript.create(this);

        mInAllocation    = Allocation.createSized(mRS, Element.F32(mRS),4);
        mOutAllocation   = Allocation.createTyped(mRS,mInAllocation.getType());
        mScript = new ScriptC_Square(mRS, getResources(), R.raw.square);

        mInAllocation.copyFrom(input);
        mScript.forEach_root(mInAllocation, mOutAllocation); // calls the forEach function to operate on the root function (each allocation input, will have a corresponding allocation output
        mOutAllocation.copyTo(output); // copy the result that was stored in mOutAllocation into the array output

        t1.setText(String.format("Input:%s\n\noutput:%s",
                                    ArrayToString(input), ArrayToString(output)));
    }


    /**
     * this function just print each element of a primitive float array into a text string
     * @param array
     * @return
     */
    public String ArrayToString(float[] array){

        String s="";
        for(int i=0; i<array.length; i++){
            s+= String.format("\nValue %d: %f", i, array[i]);
        }

        return s;
    }

}

这是我的 Square.rs 文件:

#pragma version(1)
#pragma rs java_package_name(com.example.sum)//don't forget to change that package name

void root(const float *v_in, float  *v_out ){

    *v_out = pow(*v_in, 2); //use the internal pow function of Renderscript pow(float x, float y) = x ^y;

 }
于 2013-07-01T23:18:30.453 回答