android - 使用 Renderscript 支持库获取不同平台的不同错误

标签 android eclipse renderscript

我在尝试实现一些用 Renderscript for Android 编写的代码时遇到了不同的麻烦。 首先让我说我所有的 SDK 包都是最新的 22.3 版本,包括 Ecplise ADT 和 Build-Tools 19.0.0。

我的目的是在广泛的 Android 平台上实现一些高计算图像算法,可能从 API 8 开始。为此,我设置了对 renderscript-v8 库的引用在我的 Ecplise 项目上,同时将应用程序定位到 API 19。

我有两个 Android 设备要测试,第一个是 Android 4.3 (API 18),第二个是 Android 2.2 (API 8)。我在运行这段代码时遇到了不同的异常,它调用了 ScriptIntrinsicYuvToRGB (代码部分取自 Executing ScriptIntrinsicYuvToRgb 问题):

/* --------------
   global vars */

private RenderScript rs;
private ScriptIntrinsicYuvToRGB rs_YUVtoRGB;
private Allocation rs_YUVtoRGB_in;
private Allocation rs_YUVtoRGB_out;  

/* --------------
in constructor... */

this.rs = RenderScript.create(this.getContext());
this.rs_YUVtoRGB = ScriptIntrinsicYuvToRGB.create(this.rs, Element.U8_4(rs));

Type.Builder tb_in = new Type.Builder(this.rs, Element.createPixel(this.rs, Element.DataType.UNSIGNED_8, Element.DataKind.PIXEL_YUV));
tb_in.setX(prevWidth);
tb_in.setY(prevHeight);
tb_in.setMipmaps(false);
tb_in.setYuvFormat(this.camera.getParameters().getPreviewFormat());
this.rs_YUVtoRGB_in = Allocation.createTyped(this.rs, tb_in.create(), Allocation.USAGE_SCRIPT);

Type.Builder tb_out = new Type.Builder(this.rs, Element.RGBA_8888(this.rs));
tb_out.setX(prevWidth);
tb_out.setY(prevHeight);
tb_out.setMipmaps(false);
this.rs_YUVtoRGB_out = Allocation.createTyped (this.rs, tb_out.create(), Allocation.USAGE_SCRIPT);

/* --------------
launching the script... */

// byte[] raw... // a YUV image

this.rs_YUVtoRGB_in.copyFrom(raw);
this.rs_YUVtoRGB.setInput(this.rs_YUVtoRGB_in);
this.rs_YUVtoRGB.forEach(this.rs_YUVtoRGB_out);

int[] framePixels = new int[previewSize.width * previewSize.height];
this.rs_YUVtoRGB_out.copyTo(framePixels);  // final RGB converted image

Eclipse 设法编译它(这应该意味着该库被很好地引用),但是...

Android 4.3 在以下位置失败:Type.Builder tb_in = new Type.Builder(this.rs, Element.createPixel(this.rs, Element.DataType.UNSIGNED_8, Element.DataKind.PIXEL_YUV)); 使用 Unsupported DataKind

11-24 11:17:57.685: E/AndroidRuntime(2494): FATAL EXCEPTION: main
11-24 11:17:57.685: E/AndroidRuntime(2494): android.renderscript.RSIllegalArgumentException: Unsupported DataKind
11-24 11:17:57.685: E/AndroidRuntime(2494):     at android.renderscript.Element.createPixel(Element.java:911)
11-24 11:17:57.685: E/AndroidRuntime(2494):     at android.support.v8.renderscript.ElementThunker.createPixel(ElementThunker.java:224)
11-24 11:17:57.685: E/AndroidRuntime(2494):     at android.support.v8.renderscript.Element.createPixel(Element.java:832)
11-24 11:17:57.685: E/AndroidRuntime(2494):     at com.lag.appprj.CameraPreview.setupCamera(CameraPreview.java:167)
11-24 11:17:57.685: E/AndroidRuntime(2494):     at com.lag.appprj.CameraPreview.surfaceCreated(CameraPreview.java:86)
11-24 11:17:57.685: E/AndroidRuntime(2494):     at android.view.SurfaceView.updateWindow(SurfaceView.java:571)
11-24 11:17:57.685: E/AndroidRuntime(2494):     at android.view.SurfaceView.access$000(SurfaceView.java:86)
11-24 11:17:57.685: E/AndroidRuntime(2494):     at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:175)
11-24 11:17:57.685: E/AndroidRuntime(2494):     at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:833)
11-24 11:17:57.685: E/AndroidRuntime(2494):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1860)
11-24 11:17:57.685: E/AndroidRuntime(2494):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)
11-24 11:17:57.685: E/AndroidRuntime(2494):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481)
11-24 11:17:57.685: E/AndroidRuntime(2494):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)

虽然在 Android 2.2 上它在初始化阶段失败:Error loading RS jni library: java.lang.UnsatisfiedLinkError: Library RSSupport not found

11-24 11:45:45.329: E/AndroidRuntime(2048): FATAL EXCEPTION: main
11-24 11:45:45.329: E/AndroidRuntime(2048): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.lag.appprj/com.lag.appprj.CaptureActivity}: android.support.v8.renderscript.RSRuntimeException: Error loading RS jni library: java.lang.UnsatisfiedLinkError: Library RSSupport not found
11-24 11:45:45.329: E/AndroidRuntime(2048):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
11-24 11:45:45.329: E/AndroidRuntime(2048):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
11-24 11:45:45.329: E/AndroidRuntime(2048):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
11-24 11:45:45.329: E/AndroidRuntime(2048):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
11-24 11:45:45.329: E/AndroidRuntime(2048):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-24 11:45:45.329: E/AndroidRuntime(2048):     at android.os.Looper.loop(Looper.java:123)
11-24 11:45:45.329: E/AndroidRuntime(2048):     at android.app.ActivityThread.main(ActivityThread.java:4627)
11-24 11:45:45.329: E/AndroidRuntime(2048):     at java.lang.reflect.Method.invokeNative(Native Method)
11-24 11:45:45.329: E/AndroidRuntime(2048):     at java.lang.reflect.Method.invoke(Method.java:521)
11-24 11:45:45.329: E/AndroidRuntime(2048):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
11-24 11:45:45.329: E/AndroidRuntime(2048):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
11-24 11:45:45.329: E/AndroidRuntime(2048):     at dalvik.system.NativeStart.main(Native Method)
11-24 11:45:45.329: E/AndroidRuntime(2048): Caused by: android.support.v8.renderscript.RSRuntimeException: Error loading RS jni library: java.lang.UnsatisfiedLinkError: Library RSSupport not found
11-24 11:45:45.329: E/AndroidRuntime(2048):     at android.support.v8.renderscript.RenderScript.create(RenderScript.java:945)
11-24 11:45:45.329: E/AndroidRuntime(2048):     at android.support.v8.renderscript.RenderScript.create(RenderScript.java:982)
11-24 11:45:45.329: E/AndroidRuntime(2048):     at android.support.v8.renderscript.RenderScript.create(RenderScript.java:968)
11-24 11:45:45.329: E/AndroidRuntime(2048):     at com.lag.appprj.CameraPreview.<init>(CameraPreview.java:80)
11-24 11:45:45.329: E/AndroidRuntime(2048):     at com.lag.appprj.CaptureActivity.onCreate(CaptureActivity.java:34)
11-24 11:45:45.329: E/AndroidRuntime(2048):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11-24 11:45:45.329: E/AndroidRuntime(2048):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)

感谢帮助

最佳答案

createPixel() 的错误实际上是 ElementThunker.java 中的错误。它缺少 PIXEL_YUV 的大小写,因此它最终返回 null 而不是适当的类型。我将在 AOSP 和 future 的 SDK 版本中修复此问题。 (补丁位于 https://android-review.googlesource.com/70810 )。

至于库加载问题,我相信在您的其他 SO 问题中,您注意到您的 Application.mk 文件并未针对所有架构构建(因此未 bundle 适当的共享库)。它在 4.3 上工作的原因是 4.3 自动拥有 libRSSupport.so 的副本(尽管它确实不应该)。较旧的设备显然没有该 .so 的默认/system/lib/副本,因此它们将始终无法加载它,除非您的构建实际将其与 apk 打包在一起。

关于android - 使用 Renderscript 支持库获取不同平台的不同错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20173680/

相关文章:

android - 多级 View : expandablelistview

java - 如何让 JobService 在初始延迟后运行?

android - Retrofit2 onResponse 方法可以有空响应吗?

eclipse - 这个简单的 Eclipse 插件有什么问题?

android - Renderscript 中的直方图匹配

java - Android socket io事件和 channel

Eclipse Juno 构建错误, "Maven Project Builder"

java - eclipse 的垃圾收集器与默认的不同吗?

android - 将引用的分配传递给 Renderscript 根函数?

android - 如何强制渲染脚本内核仅在 Nexus5 设备 android-4.4.4_r1 的 GPU 上运行