之前有个程序在PC、MAC上能正常跑,打包成apk就会闪退。后来不断尝试,发现当把读取json的代码注释掉就可以正常运行,一放开就挂,然后那份代码其实之前在3.2版本编译过是没有问题的,当然代码还是有点改动的,为了防止是其他地方引起,就又把版本退回3.2试了下,没有问题。所以,3.3版本json读取有什么改动呢?
没有看到有什么对它的改动啊,这是版本变更说明,你可以看下https://github.com/fusijie/Cocos2dx-ReleaseNote-zh
至于楼主遇到的这问题,我还是第一次看到
是哪部分代码使用json?是你自己的还是引擎内部哪个模块解析用了json?
如果是你自己使用了external/json这个第三方库,那需要确认一下json库是否有升级,我们不会自己修改这些第三方库。
如果是引擎的哪个模块使用了json解析,请描述清楚。
bool AppDelegate::applicationDidFinishLaunching() {
// initialize director
auto director = Director::getInstance();
Common::getInstance()->readDataByJson("config.json");
auto glview = director->getOpenGLView();
if(!glview) {
glview = GLViewImpl::create("FlySimulation");
director->setOpenGLView(glview);
}
glview->setDesignResolutionSize(g_vPageInfo.m_ffarmWidth, g_vPageInfo.m_ffarmHeight, ResolutionPolicy::EXACT_FIT);
//glview->setFrameSize(g_vPageInfo.m_ffarmWidth, g_vPageInfo.m_ffarmHeight);
// turn on display FPS
director->setDisplayStats(false);
// set FPS. the default value is 1.0/60 if you don't call this
director->setAnimationInterval(1.0 / 60);
// create a scene. it's an autorelease object
auto scene = MFDLayer::createScene();
//auto scene = HelloWorld::createScene();
// run
director->runWithScene(scene);
return true;
}
void Common::readDataByJson(const char* fileName)
{
g_vPageInfo.clear();
if (FileUtils::getInstance()->isFileExist(fileName))
{
rapidjson::Document doc;
//unsigned long size;
string data = FileUtils::getInstance()->getStringFromFile(fileName);
//去注释
char* jsonData = (char*)malloc(sizeof(char) * (data.size()+1));
memset(jsonData, 0, data.size()+1);
getRealString(jsonData, data.c_str(), (int)data.size());
doc.Parse(jsonData);
free(jsonData);
if (!doc.HasParseError() && doc.IsArray()){
for (unsigned int i = 0; i < doc.Size(); i++)
{
//每一页的配置
rapidjson::Value &v = doc*;
PageData curPage;
//memset(&curPage, 0, sizeof(PageData));
curPage.m_mParamValue.clear();
if (v.HasMember("farmWidth")){
curPage.m_ffarmWidth = v"farmWidth"].GetDouble();
}else{
curPage.m_ffarmWidth =960.0f;
}
if (v.HasMember("farmHeight")){
curPage.m_ffarmHeight = v"farmHeight"].GetDouble();
}else{
curPage.m_ffarmHeight = 640.0f;
}
if (v.HasMember("background")){
curPage.m_background = v"background"].GetString();
}else{
curPage.m_background = "";
}
//当前页的控件列表
if (v.HasMember("WidgetList")){
rapidjson::Value &vw=v"WidgetList"];
if (vw.IsArray())
{
for (unsigned int j = 0; j < vw.Size(); j++)
{
rapidjson::Value &aw=vw;
WidgetData* pcurWidget = new WidgetData;
memset(pcurWidget, 0, sizeof(WidgetData));
pcurWidget->m_vbaseData.clear();
if (aw.HasMember("name"))
{
pcurWidget->m_sWidgetName = aw"name"].GetString();
}
else
{
CCLOG("error: no name!");
}
if (aw.HasMember("positionX"))
{
pcurWidget->m_fPositionX = (float)aw"positionX"].GetDouble();
}
else
{
pcurWidget->m_fPositionX = 0;
}
if (aw.HasMember("positionY"))
{
pcurWidget->m_fPositionY = (float)aw"positionY"].GetDouble();
}
else
{
pcurWidget->m_fPositionY = 0;
}
if (aw.HasMember("zorder"))
{
pcurWidget->m_iWidgetZorder = aw"zorder"].GetInt();
}
else
{
pcurWidget->m_iWidgetZorder = 0;
}
//当前控件的参数
if (aw.HasMember("param"))
{
rapidjson::Value &vp=aw"param"];
if (vp.IsArray())
{
for (unsigned int k = 0; k < vp.Size(); k++)
{
rapidjson::Value &ap=vp;
BaseData curBaseData;
memset(&curBaseData, 0, sizeof(BaseData));
if (ap.IsNumber())
{
curBaseData.m_dataType = 0;
curBaseData.m_fData = (float)ap.GetDouble();
}
else if (ap.IsString())
{
curBaseData.m_dataType = 1;
curBaseData.m_sData = ap.GetString();
}
else
{
CCLOG("warning: no this data type: %d", ap.GetType());
}
pcurWidget->m_vbaseData.push_back(curBaseData);
}
}
}
else
{
CCLOG("warning: WidgetList!");
}
char widgetCount = {0};
sprintf(widgetCount,"Page%dWidget%d", i, j);
curPage.m_mParamValue.insert(pair(widgetCount,pcurWidget));
}
}
}
else
{
CCLOG("error: no param!");
}
g_vPageInfo.push_back(curPage);
}
}
}
}
```
就是在AppDelegate里先读取json配置*
我看了下json库,3.2和3.3应该是一样的,没升级过。你确认下挂在什么地方。这应该和rapidjson相关性大一点。
看不出来,不过我刚写的解析json文件, 比较懒写的简单,省了许多没写, 代码如下
rapidjson::Document doc;
std::string JsonData = FileUtils::getInstance()->getStringFromFile(“conf/PayGuide.json”);
doc.Parserapidjson::kParseDefaultFlags(JsonData.c_str());
rapidjson::Value &v = doc;
id = DICTOOL->getIntValue_json(v, "pay_id", 0);
std::string titleFileName = DICTOOL->getStringValue_json(v, "pay_title", "");
this->initTitle(titleFileName);
std::string iconFileName = DICTOOL->getStringValue_json(v, "pay_icon", "");
this->initIcon(iconFileName);
std::string notice_1 = DICTOOL->getStringValue_json(v, "pay_notice_1", "");
std::string notice_2 = DICTOOL->getStringValue_json(v, "pay_notice_2", "");
std::string notice_3 = DICTOOL->getStringValue_json(v, "pay_notice_3", "");
this->initNameAndNotice(notice_1, Gold, notice_2, SongGold, SongType, notice_3, noticeGold);
std::string notice = DICTOOL->getStringValue_json(v, "pay_notice", "");
this->initPayNotice(notice, value1, value2, value3, value4, value5);