为什么要用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端注册绑定的地方是否有问题。