Cocos2d-x 已经提供了对 Lua 的基本支持,但除了 Lua 的基本库外,并没有捆绑一些常用库,例如 LuaSocket。
经过一番尝试,终于搞定了此问题 :)
获得 LuaSocket 源代码后,在 cocos2d-x 项目的 libs/lua 目录中建立子目录 exts/luasocket,并将 luasocket-2.0.2/src 目录中所有的 *.c/*.h 文件拷贝到 libs/lua/exts/luasocket 目录中。
在 libs/lua/exts 目录中建立文件:
lualoadexts.h
#ifndef __LUALOADEXTS_H_ #define __LUALOADEXTS_H_ #include "lauxlib.h" void luax_initpreload(lua_State *L); #endif // __LUALOADEXTS_H_
lualoadexts.c
#include "lualoadexts.h" // luasocket #include "luasocket.h" #include "mime.h" static luaL_Reg luax_preload_list[] = { {"socket.core", luaopen_socket_core}, {"mime.core", luaopen_mime_core}, {NULL, NULL} }; void luax_initpreload(lua_State *L) { luaL_Reg* lib = luax_preload_list; luaL_findtable(L, LUA_GLOBALSINDEX, "package.preload", sizeof(luax_preload_list)/sizeof(luax_preload_list[0])-1); for (; lib->func; lib++) { lua_pushstring(L, lib->name); lua_pushcfunction(L, lib->func); lua_rawset(L, -3); } lua_pop(L, 1); }
最后,打开 libs/lua/cocos2dx_support/LuaEngineImpl.cpp 文件,在 CCLuaScriptModule::CCLuaScriptModule() 构造函数最后载入 Lua 标准库和扩展库的代码:
CCLuaScriptModule::CCLuaScriptModule() { d_ownsState = true; d_state = lua_open(); luaL_openlibs(d_state); int nOpen = tolua_Cocos2d_open(d_state); CC_UNUSED_PARAM(nOpen); nOpen = tolua_SimpleAudioEngine_open(d_state); CC_UNUSED_PARAM(nOpen); // init standard libraries luaL_openlibs(d_state); // init more libraries luax_initpreload(d_state); }
LuaScoket 除了 C 代码,还有一部分是 Lua 代码,所以需要将 luasocket-2.0.2/src/*.lua 复制到项目中,然后用下列 Lua 代码进行测试:
local socket = require("socket") print("socket module:", socket) print("socket.connect function:", socket.connect) print("socket.bind function:", socket.bind) print("\n") print("io module:", io)