繁体   English   中英

RenderScript:一个ScriptC_XXXX无法创建两次?

[英]RenderScript: One ScriptC_XXXX can't be created twice?

这是我的类RSBaseFilterEngine的构造函数,并且我的程序将在不同的活动中创建该类的许多实例。

public RSBaseFilterEngine(Context context) {
    rs = RenderScript.create(context);
    this.context = context;
    script = new ScriptC_BaseFilter(rs);
}

问题是,如果我收到此类的指令超过1次,程序将崩溃。 处理程序时将发生崩溃

script = new ScriptC_BaseFilter(rs);

并且,错误日志是

Caused by: android.support.v8.renderscript.RSRuntimeException: Loading of ScriptC script failed.
at android.support.v8.renderscript.ScriptC.<init>(ScriptC.java:69)
at com.xxxxxxxxxxx.xxxxxxxx.algorithms.filter.ScriptC_BaseFilter.<init>(ScriptC_BaseFilter.java:41)
at com.xxxxxxxxxxx.xxxxxxxx.algorithms.filter.ScriptC_BaseFilter.<init>(ScriptC_BaseFilter.java:35)
at com.xxxxxxxxxxx.xxxxxxxx.algorithms.RSBaseFilterEngine.<init>(RSBaseFilterEngine.java:33)

为什么无法两次创建ScriptC_BaseFilter? 然后,我改变了这样的代码

public RSBaseFilterEngine(Context context) {
    rs = RenderScript.create(context);
    this.context = context;
    script = new ScriptC_BaseFilter(rs);
    script.destroy();
    script = new ScriptC_BaseFilter(rs);
}

如我所料,当程序第一次调用此构造函数时,它崩溃了。

那么,谁能告诉我为什么这样做会增强呢? 是否有一些我不注意的细节?谢谢。


好吧,我将发布整个logcat

01-28 10:50:58.637: E/RenderScript(26067): Could not create symlink /data/data/com.xxxxxxxxxxx.xxxxxxxx.algorithms.demo/cache/com.android.renderscript.cache/librs.basefilter#93xfAC.so -> /data/data/com.xxxxxxxxxxx.xxxxxxxx.algorithms.demo//lib/librs.basefilter.so
01-28 10:50:58.637: E/RenderScript(26067): Unable to open shared library (/data/data/com.xxxxxxxxxxx.xxxxxxxx.algorithms.demo//lib/librs.basefilter.so): Symbol not found: load_library[1096]: Library '/system/lib/egl/libGLESv2S3D_adreno200.so' not found
01-28 10:50:58.657: E/RenderScript(26067): Unable to open system shared library (/system/lib/librs.basefilter.so): (null)
01-28 10:50:58.657: D/AndroidRuntime(26067): Shutting down VM
01-28 10:50:58.657: W/dalvikvm(26067): threadid=1: thread exiting with uncaught exception (group=0x40ad5228)
01-28 10:50:58.727: E/AndroidRuntime(26067): FATAL EXCEPTION: main
01-28 10:50:58.727: E/AndroidRuntime(26067): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xxxxxxxxxxx.xxxxxxxx.algorithms.demo/com.xxxxxxxxxxx.xxxxxxxx.algorithms.demo.EffectActivity}: android.support.v8.renderscript.RSRuntimeException: Loading of ScriptC script failed.
01-28 10:50:58.727: E/AndroidRuntime(26067):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2194)
01-28 10:50:58.727: E/AndroidRuntime(26067):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2229)
01-28 10:50:58.727: E/AndroidRuntime(26067):    at android.app.ActivityThread.access$600(ActivityThread.java:139)
01-28 10:50:58.727: E/AndroidRuntime(26067):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1261)
01-28 10:50:58.727: E/AndroidRuntime(26067):    at android.os.Handler.dispatchMessage(Handler.java:99)
01-28 10:50:58.727: E/AndroidRuntime(26067):    at android.os.Looper.loop(Looper.java:154)
01-28 10:50:58.727: E/AndroidRuntime(26067):    at android.app.ActivityThread.main(ActivityThread.java:4945)
01-28 10:50:58.727: E/AndroidRuntime(26067):    at java.lang.reflect.Method.invokeNative(Native Method)
01-28 10:50:58.727: E/AndroidRuntime(26067):    at java.lang.reflect.Method.invoke(Method.java:511)
01-28 10:50:58.727: E/AndroidRuntime(26067):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-28 10:50:58.727: E/AndroidRuntime(26067):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-28 10:50:58.727: E/AndroidRuntime(26067):    at dalvik.system.NativeStart.main(Native Method)
01-28 10:50:58.727: E/AndroidRuntime(26067): Caused by: android.support.v8.renderscript.RSRuntimeException: Loading of ScriptC script failed.
01-28 10:50:58.727: E/AndroidRuntime(26067):    at android.support.v8.renderscript.ScriptC.<init>(ScriptC.java:69)
01-28 10:50:58.727: E/AndroidRuntime(26067):    at com.xxxxxxxxxxx.xxxxxxxx.algorithms.filter.ScriptC_BaseFilter.<init>(ScriptC_BaseFilter.java:41)
01-28 10:50:58.727: E/AndroidRuntime(26067):    at com.xxxxxxxxxxx.xxxxxxxx.algorithms.filter.ScriptC_BaseFilter.<init>(ScriptC_BaseFilter.java:35)
01-28 10:50:58.727: E/AndroidRuntime(26067):    at com.xxxxxxxxxxx.xxxxxxxx.algorithms.RSBaseFilterEngine.<init>(RSBaseFilterEngine.java:64)
01-28 10:50:58.727: E/AndroidRuntime(26067):    at com.xxxxxxxxxxx.xxxxxxxx.algorithms.RSBaseFilterEngine.getInstance(RSBaseFilterEngine.java:75)
01-28 10:50:58.727: E/AndroidRuntime(26067):    at com.xxxxxxxxxxx.xxxxxxxx.algorithms.demo.EffectActivity.onCreate(EffectActivity.java:87)
01-28 10:50:58.727: E/AndroidRuntime(26067):    at android.app.Activity.performCreate(Activity.java:4531)
01-28 10:50:58.727: E/AndroidRuntime(26067):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071)
01-28 10:50:58.727: E/AndroidRuntime(26067):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2150)
01-28 10:50:58.727: E/AndroidRuntime(26067):    ... 11 more

我将发布我最近进行的一些测试。

以下代码段将使程序崩溃,其共同点是它们尝试两次创建相同的脚本:

rs = RenderScript.create(context);
script = new ScriptC_BaseFilter(rs);
rs.destroy(); // same problem occurred after changed this line to rs.finish() 
rs = RenderScript.create(context);
script = new ScriptC_BaseFilter(rs);

// create same script using different renderscript context will not help
// do rs and rs_base use the same context?
rs = RenderScript.create(context);
rs_base = RenderScript.create(context);
script = new ScriptC_BaseFilter(rs);
script_base = new ScriptC_BaseFilter(rs_base);

您可以检查以下内容吗? rs.finish刷新renderscript中所有未完成的命令

rs = RenderScript.create(context);
this.context = context;
script = new ScriptC_BaseFilter(rs);
script.destroy();
rs.finish(); //ADD THIS LINE IN YOUR CODE 
script = new ScriptC_BaseFilter(rs);

我的同事找到了解决此问题的解决方案。

首先,您应确保这些代码必须添加到文件“ project.properties”中

#------ RenderScript Configuration -------
renderscript.target=18

renderscript.support.mode=true

sdk.buildtools=18.1.0

#------ RenderScript Configuration -------

然后,用更大的文件替换sdk / build-tools / 18.1.0中的文件“ libbcc.dll”(原始文件的大小小于1M,正确的文件为5.1M)。

您可以在此网站上下载https://code.google.com/p/android/issues/detail?id=60327&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&start=200

com.xxxxxxxxxxx.xxxxxxxx.algorithms.demo是您放入.rs文件编译指示中的项目的实际名称吗? 这必须完全匹配,否则您将无法加载.bc / .so文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM