Ответ 1
Я пытался вызвать неинициализированный холст внутри другого класса, поэтому, когда он пытался получить высоту или ширину, он бы разбился.
В приложении, которое я разрабатываю на Android, я продолжаю получать ошибку Fatal Signal 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)
Я пытался вызвать неинициализированный холст внутри другого класса, поэтому, когда он пытался получить высоту или ширину, он бы разбился.
У меня была та же проблема с экземпляром android.media.MediaRecorder.
Вызывается код, доступ к которому #getMaxAmplitude()
после #reset()
и #release()
в экземпляре MediaRecorder.
У меня была такая же проблема сегодня утром, и я смог отследить ее, чтобы случайно сохранить изображение шириной 800 пикселей в папке drawable-mdpi. Когда я понял, что случилось, я занялся им на секунду. Я попытался сжимать его, чтобы понять, связано ли это с размером файла, и это не так. Затем я попытался сохранить его снова на 650 пикселей в ширину, и он сработал из этой папки. Так что где-то между точкой разлома для каждой папки я бы догадался. Затем я поместил изображение 800 p wide в предназначенную папку hdpi и 480 p ширину в mdpi, и он зафиксировал его.
У меня была такая же проблема и я нашел после хорошей ночи сна и кофе утром, что я был достаточно глупым, чтобы поддержать холст с неинициализированным растровым изображением. Кажется, что много, если не весь код рисования холста - это собственный код, и передача неинициализированных объектов не обнаруживается повсюду.
SIGSEGV с нулевым адресом (0x00000000) означает, что ваше приложение разыменовало нулевой указатель, поэтому обратите внимание на места, где вы передаете нулевые указатели (т.е. пустые ссылки на экземпляры объектов, которые вы не создавали в первую очередь) для кода который поддерживается собственным кодом и неправильно проверяет эту ошибку.
У меня возникла та же самая Неустранимая ошибка при использовании класса 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 и фатальной ошибке.
У меня была эта проблема, когда я делал приложение cocos2d-x для Android. проблема заключалась в том, что мой слой был CCLayer:
CCLayer::init()
но в файле заголовка я:
class HelloWorld : public cocos2d::CCLayerColor
я изменил CCLayerColor на CCLayer и мое приложение работало
То же самое произошло со мной во время разработки игры с использованием платформы LibGDX для Android, и вот почему:
У меня есть 2 экрана - GameScreen
и BattleScreen
. GameScreen
, где я перемещаю свой персонаж на карту. Когда я столкнулся с вражеским спрайтом, я мгновенно использую game.setScreen(new BattleScreen(this))
и меняю текущий экран на BattleScreen
. Здесь, где произошел смертельный сигнал 11. Сначала я подумал, что это связано с загрузкой активов, потому что мой экземпляр менеджера ресурсов был статичным. Я пытался несколько способов загрузить их, но ничего не получилось. Оказалось, что я меняю экран в неправильном месте. Для моего GameScreen
у меня были экземпляры WorldController
и WorldRenderer
. Я использовал worldController.update()
и worldRenderer.render()
внутри метода GameScreen
render(float deltaTime)
. Внутри worldController.update()
я проверял наличие столкновений и смену экрана, как только нашел его с врагом. Это было плохо для Android, возможно, потому, что это произошло между обновлением и рендерингом, или потребовалось некоторое время, в то время как обновление все еще работало, и это привело к конфликтам - я не знаю. Но вот как я его исправил:
WorldController
и каждый раз, когда произошло столкновение с противником, я устанавливал его в trueGameScreen
render()
Я проверял этот флаг - если бы он был правдой, я бы изменил экран на BattleScreen
, в противном случае я бы обновил и отобразил GameScreen
Теперь он отлично работает каждый раз, без ошибок FATAL SIGNAL ERROR 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 для android, и я обнаружил, что эта ошибка вызванный Box2d, который использует собственный код, лучше посмотреть на часть вашего кода, который использует Box2d, и посмотреть, есть ли какие-либо нулевые указатели.
В моем случае BluetoothSocket
был пустым при попытке установить соединение Bluetooth