1

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) することです。

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 でビルドすると、すべて正常に動作します。

また、実際にはアプリケーション自体がクラッシュするのではなく (いくつかのアクティビティが含まれています)、1 つのスレッドが RenderScript のものであると思われます。クラッシュ後、以前のアクティビティが再び前面に表示されます。

助けていただければ幸いです。事前に感謝します

4

2 に答える 2

1

ここで RS を使って他に何もしていないのですか? Ant コマンドがリソースを .apk に適切にパッケージ化していない可能性はありますか? おそらく、各ビルドで生成された実際の .apk ファイルを検査し、リソースなどを比較して、それらが同等であることを確認する価値があります。

最後の質問: あなたのファイルは kernel.rs という名前ですか?

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

安全のために、実際には次のように書き換える必要があります。

mScript = new ScriptC_kernel(mRS);

それらは同等であり (kernel.rs を使用していると仮定)、2 番目のものはエラーが発生しにくいです (この行をコピーして別のスクリプトに貼り付けた場合)。間違ったスクリプトをロードすると、このエラーが発生することがわかりましたが、それさえありそうにない。

于 2016-01-06T21:54:48.160 に答える
-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
于 2016-11-22T07:51:44.357 に答える