lambda 回调中 Android Cocos2D-x 应用程序段错误

Seg fault on Android Cocos2D-x app in lambda callback

我在 Cocos2D-X 游戏的 Android 版本中遇到了一个奇怪的崩溃问题。

在很多地方我都有回调,当其他一些动作完成时执行,像这样调用:

playAnimationOnce(animationName, [this] {
    m_animationStateMachine->changeState(TWITCHING_ANIM_STATE);
    m_stateMachine->changeState(DEAD);
});

在 Android 上,m_animationStateMachine 能够很好地更改状态,但是,对 m_stateMachine 的任何引用都会导致崩溃,具体而言:

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x3f800044
Stack frame #00 pc 008ed5ec  /data/app/com.bundleID.appname/lib/arm/libcocos2dcpp.so (_ZN12StateMachine11changeStateEPK5StatePKv+52): Routine StateMachine::changeState(State const*, void const*) at /path/to/project/proj.android-studio/app/jni/../../../Platform/Util/StateMachine.cpp:158
Stack frame #01 pc 007ef73c  /data/app/com.bundleID.appname/lib/arm/libcocos2dcpp.so: Routine operator() at /path/to/project/proj.android-studio/app/jni/../../../Source/Actors/Hero.cpp:1291

游戏在 iOS 上运行良好。我什至在 XCode 上针对 iOS 逐步执行回调,并验证该对象在 iOS.

上有效

我没有办法在 Android 上使用调试器,所以我无法比使用日志语句更好地检查每个变量。


我已经尝试过的事情:

还有其他一些我现在忘记的事情。请随时向我发送任何和所有建议,我不知道是什么原因造成的。

我想通了。

我仍然不知道 Android 是什么导致了这个问题,所以如果你知道,请告诉我。

本质上,当 m_animationStateMachine->changeState 被执行时,一个新的动画播放清除当前 运行 个动画,并使用 cocos2d-x 方法清除动画回调。

我认为这导致 m_animationStateMachine->changeState 之后的所有行都在某些未定义的上下文中执行。

我通过将 m_animationStateMachine->changeState 作为回调的最后一行,并在播放新动画之前更改 class' 状态来解决此问题。


将此作为答案发布,以便我可以在几天内解决这个问题,也许这对将来的其他人有所帮助。