Android 致命信号11

在我在 Android 上开发的应用程序中,我不断收到致命信号11错误。

我觉得这跟我访问记忆的方式有关但我不知道是什么引起的。

这是 LogCat:

05-02 23:47:17.618: D/dalvikvm(590): GC_FOR_ALLOC freed 68K, 4% free 6531K/6787K, paused 101ms
05-02 23:47:17.638: I/dalvikvm-heap(590): Grow heap (frag case) to 7.619MB for 1228816-byte allocation
05-02 23:47:17.738: D/dalvikvm(590): GC_CONCURRENT freed 1K, 4% free 7730K/8007K, paused 5ms+14ms
05-02 23:47:17.878: D/dalvikvm(590): GC_FOR_ALLOC freed <1K, 4% free 7730K/8007K, paused 37ms
05-02 23:47:17.888: I/dalvikvm-heap(590): Grow heap (frag case) to 8.790MB for 1228816-byte allocation
05-02 23:47:17.998: D/dalvikvm(590): GC_CONCURRENT freed <1K, 4% free 8930K/9223K, paused 4ms+4ms
05-02 23:47:17.998: A/libc(590): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)
95833 次浏览

我一直尝试在另一个类中调用一个未初始化的 Canvas,所以当它试图得到它的高度或宽度时,它会崩溃。

我在 android.media. MediaRecorder 的一个实例中遇到了同样的问题。

在调用 MediaRecorder 实例上的 #reset()#release()之后,代码访问了 #getMaxAmplitude()

我在使用 Canvas 类时经历了同样的致命错误。
我的代码看起来像这样。下面一段代码初始化一个 Arc 并将其绘制在画布上。

private RectF r1 = null;
private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);


public Arc(Context ctx) {
super(ctx);
mPaint.setColor(0xFFFF0000);
r1 = new RectF(200, 200, 400, 400);
}


protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawArc(r1, 0, 90, true, mPaint);
}

出现问题是因为我的 RectF 实例没有初始化,这导致了 NullPointerException 和致命错误。

我也遇到了同样的问题,经过一夜好眠和早上一杯咖啡后,我发现自己竟然傻到用一个未初始化的 Bitmap 来支撑画布。似乎很多画布绘图代码(如果不是全部的话)都是本机代码,并且不会在任何地方检测到未初始化对象的传递。

SIGSEGV 带有 null 地址(0x00000000)意味着你的应用已经解引用了一个 null 指针,所以注意你传递 null 指针的地方(例如空引用对象实例你没有在第一个地方实例化)的代码是由本机代码支持的,没有正确检查这个错误。

我在安卓系统上做 Cocos2d-x 应用的时候遇到过这个问题。问题是我的图层是 CCLayer:

 CCLayer::init()

但是在头文件里我有:

 class HelloWorld : public cocos2d::CCLayerColor

我把 CCLayerColor 改成了 CCLayer,我的应用程序工作了

今天早上我遇到了同样的问题,我能够回溯到意外地在可绘制 mdpi 文件夹中保存了一个800像素宽的图像。当我意识到发生了什么的时候,我稍微修改了一下。我尝试压缩它很难看到它是否与文件大小有关,但它没有。然后我再次尝试保存它在650像素宽,它的工作出该文件夹。所以在这两者之间的某个地方,我猜每个文件夹都有一个突破点。然后,我把800p 宽的图像在预期的 hdpi 文件夹和480p 宽的 mdpi 和它固定。

在我的例子中,onDraw 事件中的 null 指针异常阻止了在画布上完成绘制。我认为是一个普遍的错误信息给出时,一个抽签问题发生。

在我的案例中,当尝试建立蓝牙连接时,BluetoothSocket为空

同样的事情发生在我使用 Android 的 LibGDX 框架开发游戏的时候,原因如下:

我有两个屏幕-GameScreenBattleScreenGameScreen是我在地图上移动角色的地方。当我与敌人精灵碰撞时,我立即使用 game.setScreen(new BattleScreen(this))并将当前屏幕改为 BattleScreen。这里就是11号致命信号发生的地方。起初,我认为它与加载资产有关,因为我的资产管理器实例是静态的。我尝试了多种方法装载它们,但都不管用。结果发现我把屏幕换错了地方。对于我的 GameScreen,我有 WorldControllerWorldRenderer实例。我在 GameScreenBattleScreen1方法中使用了 worldController.update()worldRenderer.render()。在 worldController.update()内部,我正在检查碰撞和更换屏幕,一旦我发现一个与敌人。这对 Android 不利,可能是因为它发生在更新和渲染之间,或者它需要一些时间,而更新仍在运行,它会导致冲突-我不知道。但我是这样解决的:

  1. 我在 WorldController中添加了一个布尔标志(默认为 false) ,每次与敌人发生碰撞时,我都将其设置为 true
  2. GameScreenrender()我正在检查这个标志-如果它是真的,我将改变屏幕为 BattleScreen,否则我将更新和呈现 GameScreen

现在它每次都能正常工作,没有任何致命的信号错误11

下面是我的 GameScreenrender()方法:

@Override
public void render(float deltaTime) {


if(worldController.isCollisionWithEnemy()) {


game.setScreen(game.battleScreen);


} else {


if(!paused) {
worldController.update(deltaTime);
}


Gdx.gl.glClearColor(57.0f / 255.0f, 181.0f / 225.0f, 115.0f / 255.0f, 1.0f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);


worldRenderer.render();
}


}

我在对 android 使用 Libgdx 时也有这个错误,我发现这个错误是 由于 Box2d 使用了本机代码,所以最好查看使用 Box2d 的部分代码,看看是否有空指针。