Java Android:movie.draw上0x00000000(代码=1)处的致命信号11(SIGSEGV)

Java Android:movie.draw上0x00000000(代码=1)处的致命信号11(SIGSEGV),java,android,fatal-error,samsung-mobile,Java,Android,Fatal Error,Samsung Mobile,我正在尝试使用onDraw方法中的android Movie类在ImageView中显示动画gif,如下所示: @Override protected void onDraw(Canvas canvas) { canvas.drawColor(Color.TRANSPARENT); super.onDraw(canvas); long now = android.os.SystemClock.uptimeMillis();

我正在尝试使用onDraw方法中的android Movie类在ImageView中显示动画gif,如下所示:

   @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.TRANSPARENT);
        super.onDraw(canvas);
        long now = android.os.SystemClock.uptimeMillis();
        if (movieStart == 0) {
            movieStart = now;
        }
        movie = getMovieFromGif();
        if (movie != null && movie.duration() > 0) {
            try {
                int relTime = (int) ((now - movieStart) % movie.duration());
                movie.setTime(relTime);

                float movie_height = convertDpToPixels(movie.height());
                float movie_width = convertDpToPixels(movie.width());

                float new_movie_height = movie_height;
                float new_movie_width = movie_width;
                float movie_ratio = movie_width / movie_height;

                if (new_movie_width > container_width) {
                    new_movie_width = container_width;
                    new_movie_height = new_movie_width / movie_ratio;
                }

                if (new_movie_height > container_height) {
                    new_movie_height = container_height;
                    new_movie_width = new_movie_height * movie_ratio;
                }

                float scale_x = container_width / new_movie_width;
                float scale_y = container_height / new_movie_height;

                scale_x = new_movie_width / (float) movie.width();
                scale_y = new_movie_height / (float) movie.height();

                canvas.scale(scale_x, scale_y);
                float x = 0;
                if ((float) this.getWidth() > new_movie_width) {
                    x = ((this.getWidth() - (movie.width() * scale_x)) / 2f)
                            / scale_x;
                }

                movie.draw(canvas, x, 0);
                this.invalidate();
            } catch (Exception ex) {
                Log.i("onDraw()", "Error: " + ex.getMessage());
            }
        }
}
代码在大多数设备上运行正常,但在华为Ascend P7和三星galaxy a5上,应用程序在movie.draw(canvas,x,0)上崩溃,但以下情况除外:

A/libc(23632):0x00000000(代码=1)处的致命信号11(SIGSEGV), 螺纹23632

你知道电影有什么问题吗?用这些设备画画

更新: 下面是完整的堆栈跟踪

04-29 12:09:24.979:D/活动(18951):#2设置越界模式颜色 正确的
04-29 12:09:25.049:I/Adreno EGL(18951): :EGL 1.4高通公司内部版本:()
04-29 12:09:25.049:I/Adreno EGL(18951):OpenGL ES着色器编译器版本: E031.24.02.07
04-29 12:09:25.049:I/Adreno EGL(18951):构建 日期:2014年6月8日星期三04-29 12:09:25.049:I/Adreno EGL(18951):本地 分支:rb1
04-29 12:09:25.049:I/Adreno EGL(18951):远程 分支:
04-29 12:09:25.049:I/Adreno EGL(18951):局部斑块:
04-29 12:09:25.049:I/Adreno EGL(18951):重建分支:
04-29 12:09:25.079:D/OpenGLRenderer(18951):启用调试模式 0
04-29 12:09:25.109:D/skia(18951):streamToByte:输入agif 大于30MB的图像。
04-29 12:09:25.109:D/skia(18951): streamToByte:Quram agif-长度:10473
04-29 12:09:25.109: D/skia(18951):眨眼敏捷移动构造器结束9,总时间:2700
04-29 12:09:25.109:A/libc(18951):致命信号11(SIGSEGV) 0x00000000(代码=1),线程18951(com.android.gif)


执行代码movie.draw()后发生致命信号错误,rest是movie.draw()之前的行的堆栈执行跟踪。

我通过禁用android硬件加速解决了此问题:

android:hardwareAccelerated=“false”

这和什么是一样的,但令人惊讶的是,这一个对我不起作用,而这一个却起作用了。它是 仅在使用此线绘制电影的特定视图上禁用硬件加速器

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

这似乎是一个本机空指针反引用,但您需要发布完整的本机堆栈跟踪,以便解开它,而不仅仅是一行的一部分。使用堆栈跟踪更新了问题。这不是堆栈跟踪,而是堆栈跟踪之前的一些日志消息。也包括实际的堆栈跟踪。对我来说是有效的,但不是可行的解决方案,因为现在每个动画都落后了。你们找到解决方案了吗?如果禁用hardwardeAcceleration,我还面临动画滞后的问题。