使用cocos2dx-lua做开发,免不了需要利用额外的lua扩展库。lua 扩展库一般由 c/c++ 写成,其接口有两种方式生成,一种是手写luaL_register(lua5.1),另一种是利用脚本工具自动生成。这里讨论的是前者,即如何把已经写好的库导入到cocos2dx项目中使用。

一、Lua扩展库

首先我们要知道,cocos2dx 已经为我们提供不少的扩展库了,在 cocos2d-x/external/lua 目录下,我们可以看到已经有诸如 cjson,luasocket,filesysytem(lfs) 等常用库。如果我们要添加其他的库,也是添加在这里的。
我们以添加云风的sproto库来做示例。
首先介绍一下sproto库,该库是云风精心构思后对 Google protobuf 协议的一个精简,更适用于游戏开发。详情请参阅文档
但是云风的这个库只支持lua5.2+的版本,而cocos2dx使用的是lua5.1,所以要使用的话,可以试试我的修改版。我所做的修改仅仅在lua层,下层的c核心与原版一致。所做的修改只是用 bitop 库来替换lua5.2内置的bit库(5.1木有)。
首先请下载 sproto。需要的文件为 sproto.h,sproto.c,lsproto.c,sprotoparser.lua。
然后我们还需要下载其利用到的相关库 lpeg
文件准备就绪后就是导入到 cocos2dx 中。

二、导入

在 cocos2d-x/external/lua 目录下新建两个文件夹 sproto,lpeg。然后将各自的文件放入其中,为了符合cocos2dx的规范,需要在sproto中建立一个 lsproto.h 文件,内容如下。其内容只是为了方便导入,没什么具体意义。

  1. #ifndef __LUA_SPROTO_H_
  2. #define __LUA_SPROTO_H_
  3. #include "lauxlib.h"
  4. LUALIB_API int luaopen_sproto_core(lua_State *L);
  5. #endif

然后就是修改一些文件,来真正的导入了。
在cocos2d-x/cocos/scripting/lua-bindings/manual目录下,搜索 lua_extensions.c 文件。在头部包含所需文件。

  1. #include "lpeg/lptypes.h"
  2. #include "lpeg/lpcap.h"
  3. #include "lpeg/lpcode.h"
  4. #include "lpeg/lpprint.h"
  5. #include "lpeg/lptree.h"
  6. #include "lpeg/lpvm.h"
  7. #include "sproto/lsproto.h"

在 luax_exts内,加入下列几行。

  1. {"lpeg", luaopen_lpeg},
  2. {"sproto.core", luaopen_sproto_core},

三、Android

上述工作完成后,是可以在ios和mac下编译运行成功的。但Android还要多做点事情。
在cocos2d-x/cocos/scripting/lua-bindings/目录下,找到 Android.mk 文件,在那一长串加载c文件后面,依葫芦画瓢,加入我们需要的c文件,

  1. ../../../external/lua/lpeg/lpcap.c \
  2. ../../../external/lua/lpeg/lpcode.c \
  3. ../../../external/lua/lpeg/lpprint.c \
  4. ../../../external/lua/lpeg/lptree.c \
  5. ../../../external/lua/lpeg/lpvm.c \
  6. ../../../external/lua/sproto/lsproto.c \
  7. ../../../external/lua/sproto/sproto.c \

四、总结

总得来说还是很简单的,只需三步:

  • 文件放到cocos2d-x/external/lua目录下
  • 修改lua_extensions.c,包含相关文件
  • 修改Android.mk做Android支持