[英]Android Fatal Signal 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)
我一直試圖在另一個類中調用未初始化的Canvas,所以當它試圖獲得它的高度或寬度時,它會崩潰。
我對android.media.MediaRecorder的實例有同樣的問題。
代碼訪問#getMaxAmplitude()
后#reset()
和#release()
在MediaRecorder實例已被調用。
我今天早上遇到了同樣的問題,並且能夠追蹤它以便在drawable-mdpi文件夾中意外保存800像素寬的圖像。 當我意識到發生了什么事時,我用它修補了一秒鍾。 我試圖壓縮它很難看它是否與文件大小有關,但事實並非如此。 然后我嘗試再次以650像素寬保存它,它從該文件夾中解決了。 所以介於兩者之間,我猜的每個文件夾都有一個突破點。 然后我將800 p寬的圖像放在預期的hdpi文件夾中,將480 p寬的圖像放在mdpi中並修復它。
我有同樣的問題,經過一個良好的睡眠和早上喝咖啡后發現,我已經傻到足以用未初始化的Bitmap支持畫布。 看起來很多(如果不是全部)畫布繪制代碼都是本機代碼,並且到處都沒有檢測到未初始化對象的傳遞。
帶有空地址(0x00000000)的SIGSEGV意味着您的應用程序已取消引用空指針,因此請注意將空指針(即對首先未實例化的對象實例的空引用)的位置傳遞給支持的代碼通過本機代碼,並沒有正確檢查此錯誤。
我在使用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和致命錯誤。
當我在android上制作一個cocos2d-x應用程序時,我遇到了這個問題。 問題是我的圖層是CCLayer:
CCLayer::init()
但在頭文件中我有:
class HelloWorld : public cocos2d::CCLayerColor
我將CCLayerColor更改為CCLayer並且我的應用程序正常運行
在使用Android的LibGDX框架進行游戲開發時,我發生了同樣的事情,原因如下:
我有2個屏幕 - GameScreen
和BattleScreen
。 GameScreen
是我在地圖上移動角色的地方。 當我與敵人精靈發生碰撞時,我立即使用game.setScreen(new BattleScreen(this))
並將當前屏幕更改為BattleScreen
。 這就是致命信號11曾經發生過的地方。 起初我認為它與加載資產有關,因為我的資產管理器實例是靜態的。 我正在嘗試多種方式加載它們但沒有任何效果。 原來我在錯誤的地方更換了屏幕。 對於我的GameScreen
我有WorldController
和WorldRenderer
實例。 我在GameScreen
的render(float deltaTime)
方法中使用了worldController.update()
和worldRenderer.render()
。 在worldController.update()
里面,當我找到敵人時,我正在檢查碰撞和更換屏幕。 這對Android來說並不好,可能是因為它發生在更新和渲染之間,或者花了一些時間,而更新仍然在運行並且導致沖突 - 我不知道。 但這是我如何解決它:
WorldController
添加了一個布爾標志(默認為false),每當與敵人發生碰撞時,我都將其設置為true GameScreen
的render()
我正在檢查這個標志 - 如果是真的我會將屏幕更改為BattleScreen
,否則我會更新並渲染GameScreen
現在它每次都很完美,沒有任何致命信號錯誤11
這是我的GameScreen
的render()
方法:
@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();
}
}
在我的例子中,它是onDraw事件中的空指針異常,阻止在畫布上完成繪制。 我認為是繪制問題時出現的一般錯誤消息。
我在使用Libgdx for android時也遇到了這個錯誤,我發現這個錯誤是由使用本機代碼的Box2d引起的,最好看一下使用Box2d的部分代碼並查看是否有任何空指針。
在我的情況下,嘗試建立藍牙連接時, BluetoothSocket
為空
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.