Cocos2d-x 已經(jīng)提供了對 Lua 的基本支持,但除了 Lua 的基本庫外,并沒有捆綁一些常用庫,例如 LuaSocket。
經(jīng)過一番嘗試,終于搞定了此問題 :)
獲得 LuaSocket 源代碼后,在 cocos2d-x 項(xiàng)目的 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() 構(gòu)造函數(shù)最后載入 Lua 標(biāo)準(zhǔn)庫和擴(kuò)展庫的代碼:
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 復(fù)制到項(xiàng)目中,然后用下列 Lua 代碼進(jìn)行測試:
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)