Works well on iPhone but crashs at CCLayer::OnEnter() function on Android.

Hi all,

I am new here (Cocos2D-X and NDK also ), I’m trying to create a very simple game with pause and resume functions. Here is my code:

`void GameLayer::pauseGame() {
// Stop all layer updates
CCLayer::onExit();

// Add the Pause layer
PauseLayer *pause = PauseLayer::createWithGameLayer(this);
pause->setPosition(CCPointZero);

this->getParent()->addChild(pause);

}

void GameLayer::resumeGame() {
// Resume all action and selectors
this->onEnter();
}

void PauseLayer::resumeGameCallback()
{
this->removeFromParentAndCleanup(true);
_gameLayer->resumeGame();
}
`

this code works well on iPhone, but doesn’t work on Android. Here is crash logs:

Build fingerprint: ‘generic/sdk/generic:4.1.2/MASTER/495790:eng/test-keys’
pid: 3396, tid: 3410, name: UNKNOWN >>> me.ngoclt.me <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0000023c
Stack frame #00 pc 00180a34 /data/data/me.ngoclt.me/lib/libgame.so (cocos2d::CCLayer::onEnter()+28): Routine onEnter in /Users/ngoclt/Dirox/TETGAME/cocos2d-2.1beta3-x-2.1.1/TetGame/proj.android/…/…/cocos2dx/layers_scenes_transitions_nodes/CCLayer.cpp:337
Stack frame #01 pc 000fdbd8 /data/data/me.ngoclt.me/lib/libgame.so (GameLayer::resumeGame()+56): Routine resumeGame in jni/…/…/Classes/GameLayer.cpp:315
Stack frame #02 pc 00100e84 /data/data/me.ngoclt.me/lib/libgame.so (PauseLayer::resumeGameCallback()+164): Routine resumeGameCallback in (null):0
Stack frame #03 pc 00191c44 /data/data/me.ngoclt.me/lib/libgame.so (cocos2d::CCMenuItem::activate()+200): Routine activate in /Users/ngoclt/Dirox/TETGAME/cocos2d-2.1beta3-x-2.1.1/TetGame/proj.android/…/…/cocos2dx/menu_nodes/CCMenuItem.cpp:114
Stack frame #04 pc 00192344 /data/data/me.ngoclt.me/lib/libgame.so (cocos2d::CCMenuItemLabel::activate()+92): Routine activate in /Users/ngoclt/Dirox/TETGAME/cocos2d-2.1beta3-x-2.1.1/TetGame/proj.android/…/…/cocos2dx/menu_nodes/CCMenuItem.cpp:227
Stack frame #05 pc 0018dc20 /data/data/me.ngoclt.me/lib/libgame.so (cocos2d::CCMenu::ccTouchEnded(cocos2d::CCTouch**, cocos2d::CCEvent**)+228): Routine ccTouchEnded in /Users/ngoclt/Dirox/TETGAME/cocos2d-2.1beta3-x-2.1.1/TetGame/proj.android/…/…/cocos2dx/menu_nodes/CCMenu.cpp:255
Stack frame #06 pc 002005f4 /data/data/me.ngoclt.me/lib/libgame.so (cocos2d::CCTouchDispatcher::touches(cocos2d::CCSet**, cocos2d::CCEvent**, unsigned int)+788): Routine touches in /Users/ngoclt/Dirox/TETGAME/cocos2d-2.1beta3-x-2.1.1/TetGame/proj.android/…/…/cocos2dx/touch_dispatcher/CCTouchDispatcher.cpp:377
Stack frame #07 pc 00200ca8 /data/data/me.ngoclt.me/lib/libgame.so (cocos2d::CCTouchDispatcher::touchesEnded(cocos2d::CCSet**, cocos2d::CCEvent**)+56): Routine touchesEnded in /Users/ngoclt/Dirox/TETGAME/cocos2d-2.1beta3-x-2.1.1/TetGame/proj.android/…/…/cocos2dx/touch_dispatcher/CCTouchDispatcher.cpp:507
Stack frame #08 pc 001adbb8 /data/data/me.ngoclt.me/lib/libgame.so (cocos2d::CCEGLViewProtocol::handleTouchesEnd(int, int**, float**, float**)+124): Routine handleTouchesEnd in /Users/ngoclt/Dirox/TETGAME/cocos2d-2.1beta3-x-2.1.1/TetGame/proj.android/…/…/cocos2dx/platform/CCEGLViewProtocol.cpp:307
Stack frame #09 pc 001be35c /data/data/me.ngoclt.me/lib/libgame.so : Routine Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeTouchesEnd in /Users/ngoclt/Dirox/TETGAME/cocos2d-2.1beta3-x-2.1.1/TetGame/proj.android/…/…/cocos2dx/platform/android/jni/TouchesJni.cpp:42
I’m using:
**Platform:* iOS, Android.
SDK version: Android 4.0
Version of cocos2d-x: cocos2d-2.1beta3-x-2.1.1

Thanks in advance for your help!

You shouldn’t manually call onEnter(), imo.

Would you mind putting in your code for onEnter() too?

Sorry, my mistake, actually here is GameLayer::resumeGame function:

void GameLayer::resumeGame() { // Resume all action and selectors CCLayer::OnEnter(); }

BTW, these code works well on iOS.

Thanks for your help.

Hi,

Finally I knew what is my problem. The problem is PauseLayer object is released immediately after removed from parent layer (GameLayer).

this->removeFromParentAndCleanup(true);

Thanks anyway.