android上使用cocos2dx的一个bug

本文解决了在将游戏从iOS移植到Android过程中遇到的跨模块内存违例问题,特别是在使用std::string时出现的崩溃现象,并提供了一种解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来北京一星期了,大体上过得还算不错,公司的环境正是我想要的,可以从九天身上学到很多东西.主要任务是想办法把猎鸟移到android上, 一直有bug 都是在调用free 删除对象的时候 而linux windows以及ios上都没有错.很奇怪 纠结了好几天.最后发现问题在std::string上.那个经典的跨module(exe、动态库)间申请/释放内存违例的问题. 查找这个问题时真的很费时,也不容易想到.

在android上一般我们建立三个动态库 cocos2d cocosdenshion和游戏主体逻辑的动态库。一般情况下所有精灵和action都是由cocos2dx库建立,删除也由cocos2dx库删除(通过调用release()).

但是我们的游戏中为了优化使用了对象分配池,很多对象都是在游戏主体的那个动态库中分配的.

对于包含string对象的一些类如CCLabelAtlas, 分配时,把string和string内部所指向的char*字符串建立在游戏主体的动态库地址空间中,而当在cocos2dx库中删除它时,stl库会检查该char*是不是该动态库中的地址空间 这里显然不是,所以crash了.


我的解决方法是把cocos2dx编译成一个静态库,然后和游戏主体一起打包成一个动态库,这样他们的地址空间就是一样的了. 

windows上可以开启多线程dll方式 将参与合作的module统统以链入crt库,使他们在同一个地址空间中, gcc这边应该也有

但我对gcc这方面的配置可能还不是很熟,或许通过gcc的配置可以解决这个问题,希望熟悉的网友给个解答吧. 






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值