1. 程式人生 > >在cocos2dx 中使用Cjson解析json資料

在cocos2dx 中使用Cjson解析json資料

為什麼要用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端註冊繫結的地方是否有問題。