如果要把游戏嵌入另一个应用,会崩溃!

发帖前请先搜索是否有相关帖子: http://forum.cocos.com/search?q=category%3Acreator%20

反馈 Bug 时请提供

  • Creator 版本:1.6.2
  • 目标平台: Android
  • 详细报错信息,包含调用堆栈:
  • 重现方式:android中新建一activity,然后在新建的activity中启动游戏的AppActivity必崩!
  • 之前哪个版本是正常的(可选):没有正常的版本
  • 手机型号(可选):任何手机都一样
  • 手机浏览器(可选):
  • 编辑器操作系统(可选):
  • 编辑器之前是否有其它报错(可选):

偶现 Bug 请提供

  • 出现概率:必现
  • 额外线索:android中新建一activity,然后在新建的activity中启动游戏的AppActivity必崩!
2赞

把AppActivity的launchMode改为singleInstance后试试呢?

解决了,因为是要嵌入原生应用的,而大家一贯做法是把首页设成singleTask,所以,返回首页的时候,游戏页面会被销毁,所以只是更改游戏页面的launchmode是没用的,目前可能存在一些内存释放不完全的问题,不过总算是解决了游戏嵌入应用的问题,如果有更好的处理方法欢迎联系我samgan@beva.com,以下是我的解决方法:
我的cocoscreator 版本是1.6.2,所以代码有出入的话酌情处理吧
首先在Cocos2dxActivity的onCreate方法中注释以下代码
if (!isTaskRoot()) {
// Android launched another instance of the root activity into an existing task
// so just quietly finish and go away, dropping the user back into the activity
// at the top of the stack (ie: the last state of this task)
finish();
Log.w(TAG, “[Workaround] Ignore the activity started from icon!”);
return;
}
不知道啥原因,源码里头居然有这种代码,坑的我好惨,不是首页为啥要给finish呢,就不能好好找问题解决么!
然后,在main.cpp中添加一个释放资源的方法:

void cocos_android_app_destroy () {
ScriptingCore::getInstance()->cleanup();

JniMethodInfo mFinishSelf;
JniHelper::getStaticMethodInfo(mFinishSelf, "org/cocos2dx/lib/Cocos2dxActivity", "finishSelf", "()V");
mFinishSelf.env->CallStaticVoidMethod(mFinishSelf.classID, mFinishSelf.methodID);

}

在CCDirector里头添加以下代码

#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID__android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,VA_ARGS)
void cocos_android_app_destroy ();
#endif

在mainloop方法中做如下修改
void Director::mainLoop()
{
if (_purgeDirectorInNextLoop)
{
_purgeDirectorInNextLoop = false;
purgeDirector();
#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
cocos_android_app_destroy ();
#endif
}
… …
然后由于第二次启动游戏页面后再次设置GL一些属性会报错,所以这里在void Director::setGLDefaultValues()方法中添加以下代码:
void Director::setGLDefaultValues()
{
static bool inited = false;
if (inited) return;
inited = true;
… …
另外,为了下次进入能重启director,在void Director::purgeDirector()方法末尾添加:
#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
Director *tmp = s_SharedDirector;
s_SharedDirector = nullptr;
delete tmp;
#endif
最后,在游戏里头添加返回键监听:
onLoad: function () { cc.systemEvent.on(cc.SystemEvent.EventType.KEY_UP, this.onKeyUp, this); },
onKeyUp: function (event) { switch (event.keyCode) { case cc.KEY.back: this.endGame(); break; } },
endGame: function () { cc.director.end(); },
这些改完了的话应该就ok了,
大体上流程是:
第一次在游戏里头点击返回键 (此处省略其他各种方法的调用): cc.director.end() --> mainloop () --> cocos_android_app_destroy() --> 返回了上个页面
第二次进入(此处省略其他各种方法的调用):Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit --> director init --> Director::setOpenGLView --> Director::setGLDefaultValues(由于是第二次启动所以这次不会走里边的代码) --> applicationDidFinishLaunching (游戏重新启动了)

1赞

赞,更希望官方有更完美的方式。

这块代码是解决安装app后,在安装成功界面直接点“打开”游戏,再按Home切换到后台,点击主屏幕的icon再进游戏,导致Cocos2dxActivity被重新创建的问题。

iOS 是有否有解决方案

可以讲解一下嵌入原生应用的过程吗,我导入各种出错

请问一下cocos create嵌入Android项目有方案教程吗~谢谢:slightly_smiling:

现在是2.4.x版本了,引擎已经有了很大改动,按这个方法会报很多不一样的错误,谁还有可行的方案吗?

解决了没? 没解决我可以帮你 我们项目也是嵌入的 已经上线了

需要帮助,已经私信你了,感谢

需要帮助,已经私信你了,感谢

你好 我们需要帮助

你好,已经解决了吗,或者有兴趣一起讨论一下吗?

如果只是安卓,最简单的就是把cocos工程放到原生里面,然后activity用独立进程的方式启动

也可以复杂点,把cocos看成一层view,这样两个工程交叉会多一些,但是效果还行,我们用大厅加子游戏模式,大厅部分用rn,子游戏部分用cocos,可以做到的效果是,一些公用功能直接复用原生ui

大佬,留个联系方式,交流一下呗。

wx : laoguilaile1314

请问这个问题解决了吗

需要帮助111

2.4.6,同样的问题,用cleanup退出页面后大概2秒左右就崩溃了