android中的0x00000000处的致命信号11(SIGSEGV)

时间:2013-12-10 02:52:13

标签: android

在我的android应用程序中,我必须不断创建Bitmaps,这是代码:

@Override
protected byte[] getTile(int level, int col, int row) {
    double[] bbox = getBBOX(level, col, row);
    byte[] res = Util.getBitMapByteArray(bbox);
    return res;
}


public static byte[] getBitMapByteArray(double[] bbox) {
    Bitmap map = MapEngine.GetBitMap(bbox);

    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    map.compress(Bitmap.CompressFormat.JPEG, 100, stream);
    byte[] byteArray = stream.toByteArray();
    return byteArray;
}

我在触发getTile时遇到错误,我的应用程序将退出当前活动并返回上一个活动:

12-10 10:25:43.424: A/libc(12035): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 12035 (droidPlatEngine)
12-10 10:25:43.424: A/libc(12035): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 12102 (Thread-4336)

MapEngine.GetBitMap将从本机库调用本机方法。

由于方法getTile的调用是由我无法控制的其他组件(它可能从多个线程调用该方法)所以我尝试将synchronized关键字添加到这两个方法中:

@Override
protected synchronized byte[] getTile(int level, int col, int row) {
    double[] bbox = getBBOX(level, col, row);
    byte[] res = Util.getBitMapByteArray(bbox);
    return res;
}


public static synchronized byte[] getBitMapByteArray(double[] bbox) {
    Bitmap map = MapEngine.GetBitMap(bbox);

    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    map.compress(Bitmap.CompressFormat.JPEG, 100, stream);
    byte[] byteArray = stream.toByteArray();
    return byteArray;
}

现在,我的应用程序可能会运行一段时间,但在某些时候仍然会再次出现相同的错误。

然后我尝试使用DDMS来查看发生了什么,这是堆对话框:

enter image description here

此外,我发现如果我继续按下cause GC按钮,我的应用程序将会运行很长时间,如果我停止按下该按钮,则退出到之前的活动。

现在我不确定这是由线程或内存,我的java代码还是本机库引起的。

任何人都可以告诉我如何继续?

0 个答案:

没有答案