【问题标题】:RenderScript crash when creating ScriptC创建 ScriptC 时 RenderScript 崩溃
【发布时间】:2016-01-05 14:34:14
【问题描述】:

在使用 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)

问题是,在 第三次 调用 initRenderScript() 函数(即恢复应用程序、暂停、恢复、暂停和再次恢复)之后,我的应用程序崩溃 (SIGSEV) 并出现错误:

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 的。崩溃后,之前的活动再次被带到前台。

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

【问题讨论】:

  • 不应该mRS.finish() 在销毁分配之前调用吗? 等待任何未决的异步操作(例如复制到 RS 分配或 RS 脚本执行)完成 ...假设有一些未决的 asyc 操作并且您破坏分配...会发生什么如果此操作完成? ...我还看到此代码的另一个问题...您正在为每个简历创建位图...而不是释放它...它迟早会以 OOMemory 异常结束

标签: java android ant renderscript android-renderscript


【解决方案1】:

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

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

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

为了安全起见真的应该重写为:

mScript = new ScriptC_kernel(mRS);

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

【讨论】:

    【解决方案2】:

    我也有类似的问题。就我而言,崩溃发生在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-13
      • 1970-01-01
      相关资源
      最近更新 更多