在cocos2dx 中使用Cjson解析json資料
阿新 • • 發佈:2019-02-09
為什麼要用cjson呢,應為cjson得解析速度使用c,速度更快,比起2dx封裝的簡單的lua來講要快很多
以下問題操作都來自於 mac os , xcode
一 :預設cocos2dx 是沒有引入cjson,但是本地已經有了cjson庫檔案
二: 記住匯入工程時選擇對應的target,博主我當時選擇了“libcocos2dlua mac” 導致除錯ios時一直讀不到檔案,應該選擇“libcocos2dlua iOS”
三:預設攜帶的lua_cjson.h檔案中包含了兩個函式
intluaopen_cjson(lua_State *l);
int luaopen_cjson_safe(lua_State *l);
- 在AppDelegate中呼叫這兩個函式
- 此時編譯程式,會報錯,大概就是編譯器找不到luaopen_cjson
- 此時可以發現是缺少巨集命令extern所導致
- 解決辦法如下:
- 新增巨集命令 #if __cplusplus #endif
- 新增引用全域性變數 extern “C” 指定此段使用C編譯器
#if __cplusplus
extern"C" {
#endif
#include "lauxlib.h"
void LUA_EXTENSIONS_DLL
luaopen_lua_extensions(lua_State *L);
#if __cplusplus
}
#endif
四:第三部解決之後,可以編譯通過,但是遇到下一個問題:
local cjson = require(“cjson”)
匯入cjson之後程式會報錯, module not found ‘cjson’
應為cocos得lua註冊風格有兩部需要注意,這個在luaopen_cjson中並沒有被封裝,所以得自己加
ps. 這裡其實可以完全借鑑Luasocket.c的lua註冊方式
- step1. 需要新增全域性module’package’
- step2. 獲取全域性_G
- step3. 需要新增變數 ‘preload’
- step4. 此時呼叫對應的luaopen_cjson
如圖
五:此時編譯如下例子成功
總結:解決此庫編譯問題,主要是注意Lua環境變數,是否全域性,是否load,以及C端註冊繫結的地方是否有問題。