Java 创建ScriptC时RenderScript崩溃
在使用RenderScript时创建ScriptC对象存在一些神秘的问题。这是我的密码:Java 创建ScriptC时RenderScript崩溃,java,android,ant,renderscript,android-renderscript,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;
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();
}
}
我的内核(是的,它是空的):
问题是,在第三次调用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>
回溯:
#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件00000668
此外,如果我使用mScript.destory()
方法(上面有注释),我的应用程序在第一次调用initRenderScript()
后立即崩溃。最重要的是,如果我只是创建ScriptC\u内核
对象的注释行,那么一切都可以正常工作。这就是为什么我认为,创建ScriptC
对象是个问题
有没有可能,有人知道为什么会出现这个问题
奇怪的是,只有当我从命令行(使用antdebug
command,Ubuntu 14.04)构建应用程序时,这个问题才会发生。当我用Android Studio或Eclipse构建它时,一切都很好
我还应该提到,实际上并不是应用程序本身崩溃(它包含少量的活动),而是一个线程,我认为是RenderScript的。崩溃后,上一个活动再次出现在前台
我非常感谢您的帮助,
提前谢谢你,你真的在这里对RS什么都不做吗?您的ant命令是否可能没有在.apk中正确打包资源?也许值得检查在每个构建下生成的实际.apk文件,并分配资源等,以确保它们是等效的 最后一个问题:您的文件名为kernel.rs吗
mScript = new ScriptC_kernel(mRS, getResources(), R.raw.kernel);
为了安全起见,应将其改写为:
mScript = new ScriptC_kernel(mRS);
它们是等效的(假设您使用的是kernel.rs),而第二个则不太容易出错(如果您为不同的脚本复制粘贴这一行。如果加载了错误的脚本,我可以看到会发生此错误,但即使这样也不太可能。我也有类似的问题。在我的情况下,崩溃发生在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");
mRS.finish()
不应该在销毁分配之前调用吗?等待任何挂起的异步操作(例如复制到RS分配或RS脚本执行)为了完成…让我们假设有一些挂起的asyc操作,您破坏了分配…如果此操作完成,会发生什么?…我还看到此代码的另一个问题…您正在创建每个简历的位图…而不是释放它…它迟早会以OOMemory异常结束
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