创建ScriptC时RenderScript崩溃

时间:2016-01-05 14:34:14

标签: java android ant renderscript android-renderscript

使用RenderScript时创建ScriptC对象有一些神秘的问题。这是我的代码:

public class RenderScriptActivity {

    private RenderScript mRS;
    private ScriptC_kernel mScript = null;

    private Allocation m1Allocation, m2Allocation,
            m3Allocation, m4Allocation;

    private Bitmap mBitmap;

    private ImageView mView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_renderscript);
        mView = (ImageView) findViewById(R.id.image_view);
    }

    @Override
    protected void onResume() {
        super.onResume();
        initRenderScript();
    }

    @Override
    protected void onPause() {
        super.onPause();
        releaseRenderScript();
    }

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

        int size = 320*240;
        m1Allocation = Allocation.createSized(mRS, Element.I16(mRS), size);
        m2Allocation = Allocation.createSized(mRS, Element.I16_4(mRS), size);
        m3Allocation = Allocation.createSized(mRS, Element.I16_4(mRS), size);
        mBitmap = Bitmap.createBitmap(1280, 720, Bitmap.Config.ARGB_8888);
        m4Allocation = Allocation.createFromBitmap(mRS, mBitmap);

        mScript = new ScriptC_kernel(mRS, getResources(), R.raw.kernel);
    }

    private void releaseRenderScript() {

        m1Allocation.destroy();
        m2Allocation.destroy();
        m3Allocation.destroy();
        m4Allocation.destroy();
//        mScript.destroy();

        mRS.finish();
    }

}

我的内核(是的,它是空的):

#pragma version(1)
#pragma rs java_package_name(com.example.android.myrenderscript)

问题是,在第3次调用initRenderScript()函数之后(即恢复应用,暂停,恢复,暂停和再次恢复),我的应用程序崩溃(SIGSEV),错误:< / p>

backtrace:
#00  pc 00027034  /system/lib/libRS.so (android::renderscript::rsrClearObject(android::renderscript::Context const*, android::renderscript::ObjectBase**)+3)
#01  pc 00012c3b  /system/lib/libRSDriver.so
#02  pc 00000668  <unknown>

此外,如果我使用mScript.destory()方法(上面已注释),我的应用程序在第一次调用initRenderScript()后立即崩溃。最重要的是,如果我只是注释行创建ScriptC_kernel对象,那么每个人都可以正常工作。这就是为什么我认为,这是创建ScriptC对象的问题。

有没有机会,有人知道为什么会出现这个问题吗?

这里很奇怪,只有从命令行构建应用程序(使用ant debug命令,Ubuntu 14.04)才会出现问题。当我使用Android Studio或Eclipse构建它时,一切正常。

我还应该提一下,实际上不是应用程序本身崩溃(它包含少量活动),而是一个线程,我认为是RenderScript。崩溃后,之前的活动再次出现在前台。

我非常感谢任何帮助, 并提前感谢

2 个答案:

答案 0 :(得分:1)

你真的在这里做RS吗?您的ant命令是否可能未在.apk中正确打包资源?也许值得检查在每个构建下生成的实际.apk文件并区分资源等,以确保它们是等效的。

最后一个问题:你的文件叫做kernel.rs吗?

mScript = new ScriptC_kernel(mRS, getResources(), R.raw.kernel);

应该真正重写为安全:

mScript = new ScriptC_kernel(mRS);

它们是等价的(假设您正在使用kernel.rs),而第二个则更不容易出错(如果您为不同的脚本复制粘贴此行。如果加载错误,我可以看到此错误发生脚本,但即使这样也不可能。

答案 1 :(得分:-1)

我有类似的问题。在我的情况下,崩溃发生在rs.destroy

Log.d(App.LOG_TAG, "deinigRenderScript 1");
mRS.finish();
Log.d(App.LOG_TAG, "deinigRenderScript 2");
mScript.destroy();
Log.d(App.LOG_TAG, "deinigRenderScript 3");
mAllocation.destroy();
Log.d(App.LOG_TAG, "deinigRenderScript 4");
mRS.destroy(); // << crash here (different tid)
Log.i(App.LOG_TAG, "deinigRenderScript 5");

在我的情况下,这有助于:

$ cat project.properties  | grep render
renderscript.target=18
renderscript.opt.level=O3
renderscript.support.mode=false
renderscript.debug.opt.level=O3
renderscript.release.opt.level=O3