Android 在使用画布进行圆形图像时,在0x09050941(代码=1)处获取错误致命信号11(SIGSEGV)

Android 在使用画布进行圆形图像时,在0x09050941(代码=1)处获取错误致命信号11(SIGSEGV),android,sqlite,canvas,bitmap,bitmapfactory,Android,Sqlite,Canvas,Bitmap,Bitmapfactory,我遇到了一个奇怪的问题。 在我的应用程序中,用户可以更改其个人资料图片。这张图是一圈显示的。 我从相机/文件(图库)中拍摄图像&为了在圆角处隐藏位图,我使用以下代码 public static Bitmap getRoundedShape(Context context, Bitmap scaleBitmapImage, int imageWidth, int imageHeight) { int targetWidth = getDPEquivalentPixels(conte

我遇到了一个奇怪的问题。 在我的应用程序中,用户可以更改其个人资料图片。这张图是一圈显示的。 我从相机/文件(图库)中拍摄图像&为了在圆角处隐藏位图,我使用以下代码

public static Bitmap getRoundedShape(Context context, Bitmap scaleBitmapImage, int imageWidth, int imageHeight) {
        int targetWidth = getDPEquivalentPixels(context, imageWidth);
        int targetHeight = getDPEquivalentPixels(context, imageHeight);
        Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, targetHeight, Bitmap.Config.ARGB_8888);

        Canvas canvas = new Canvas(targetBitmap);
        Path path = new Path();
        path.addCircle(((float) targetWidth - 1) / 2, ((float) targetHeight - 1) / 2, (Math.min(((float) targetWidth), ((float) targetHeight)) / 2), Path.Direction.CW);
        Paint paint = new Paint();
        paint.setColor(Color.GRAY);
        // paint.setStyle(Paint.Style.STROKE);
        paint.setStyle(Paint.Style.FILL);
        paint.setAntiAlias(true);
        paint.setDither(true);
        paint.setFilterBitmap(true);
        canvas.drawOval(new RectF(0, 0, targetWidth, targetHeight), paint);

        canvas.clipPath(path);
        Bitmap sourceBitmap = scaleBitmapImage;
        canvas.drawBitmap(sourceBitmap, new Rect(0, 0, sourceBitmap.getWidth(), sourceBitmap.getHeight()), new Rect(0, 0, targetWidth, targetHeight), null);
        return targetBitmap;
    }
首先,我上传图像到服务器压缩它。然后我将其保存在本地SQLite中作为字节数组,并使用上述方法将其转换为圆形位图,以显示在
ImageView

现在,从现在开始,我将参考
SQLite
以获取配置文件图像。我的问题是第一次圆角代码工作正常,但是当我使用SQLIte图像并尝试将其转换为圆形时,我得到了以下错误

A/libc(14809): Fatal signal 11 (SIGSEGV) at 0x5f763ee0 (code=1), thread 14809
编辑::

我有一个用户POJO,它保存从SQLite检索的用户对象。我正在将这个Pojo转换成json&存储在SharedPreferance中,直到用户会话处于活动状态

public class User {

    private int uid;
    private String userName;
    private String firstName;
    private String lastName;
    private String email;
    private Date dob;
    private String gender;
    private int delFlag;
    private int pin;
    private Bitmap imageData;

}

我使用Gson进行JSON到POJO的解析,反之亦然。但我不知道Gson库是否能正确解析我的
imageData
(数据类型位图)。这可能会产生问题。

我想您应该检查一下,因为位图似乎不可序列化。我对JSON/Gson的机制知之甚少,不知道这就是问题所在。如果我处在你的位置,我会首先修改代码,让它从PNG文件而不是JSON文件中读取位图,并确认这就是问题所在。然后看一个更好的方法来序列化/存储位图,就像上面的链接一样。

我想你应该检查一下,因为看起来位图是不可序列化的。我对JSON/Gson的机制知之甚少,不知道这就是问题所在。如果我处在你的位置,我会首先修改代码,让它从PNG文件而不是JSON文件中读取位图,并确认这就是问题所在。然后看一个更好的方法来序列化/存储位图,如上面的链接。

我可以看到它在libc中,但通常如果你在LogCat中看到整个转储,你可以知道崩溃前它在什么c代码和什么java中?你可能在本机代码中取消了对空指针的引用。如果没有将任何空引用传递回位图转换器,我会非常仔细地检查。只需逐行调试即可。@hack_on-In-LogCat,我只看到这一行。其他日志通常是我在正常执行中得到的。好吧,就像edward说的,一次注释一行,直到它停止崩溃。在我看来一切都很好。我看到过一些帖子,其中一些其他代码之前将null传递给位图方法,然后它在一段完全不同的代码中爆炸。您已经检查过从SQLite返回的配置文件图像是否为空?根据Edvard的建议,我在使用配置文件pic的位图的任何位置都会进行空检查。我试着调试这个应用程序,它挂起了&然后给出了上面的错误。但我有一个疑问。请检查我的问题中的
EDIT
。我可以看到它在libc中,但通常如果您在LogCat中看到整个转储,您可以知道崩溃前它在哪个c代码和哪个java中?您可能正在取消对本机代码中空指针的引用。如果没有将任何空引用传递回位图转换器,我会非常仔细地检查。只需逐行调试即可。@hack_on-In-LogCat,我只看到这一行。其他日志通常是我在正常执行中得到的。好吧,就像edward说的,一次注释一行,直到它停止崩溃。在我看来一切都很好。我看到过一些帖子,其中一些其他代码之前将null传递给位图方法,然后它在一段完全不同的代码中爆炸。您已经检查过从SQLite返回的配置文件图像是否为空?根据Edvard的建议,我在使用配置文件pic的位图的任何位置都会进行空检查。我试着调试这个应用程序,它挂起了&然后给出了上面的错误。但我有一个疑问。请检查我的问题中的
EDIT
。是的,你是对的。
位图
字节数组
未通过
Gson
序列化。我将我的
位图
声明为
瞬态
。从而避免了序列化。每当我需要图像时,我只需查询
SQLite
。我确信我收到了错误,因为位图转换可能接收到空值。谢谢。是的,你说得对。
位图
字节数组
未通过
Gson
序列化。我将我的
位图
声明为
瞬态
。从而避免了序列化。每当我需要图像时,我只需查询
SQLite
。我确信我收到了错误,因为位图转换可能接收到空值。谢谢