本文將向您介紹Quick-Cocos2d-x集成google protobuf的方法。
第一步 需要最新的protobuf 類(lèi)庫(kù)和解析程序。
然后,可以得到重要的兩個(gè)目錄
1 2 | protoc-gen-lua/plugin/
protoc-gen-lua/protobuf/
|
第二步, 需要使用protoc —lua_out=. 這種方法, 將我們自己的*.proto 的文件解析成lua文件
plugin目錄是提供將buffer 文件解析成lua 版本的類(lèi)庫(kù), 需要python 支持。 如果已經(jīng)編譯了google 官方的protoc 那個(gè)程序, 只需要在系統(tǒng)PATH環(huán)境變量總追加plugin目錄就好:
1 | export PATH={protoc-gen-lua DIR }/plugin:$PATH
|
關(guān)于protoc的編譯另請(qǐng)google .
如果解析不出lua文件來(lái), 可以手動(dòng)志信一下plugin/protoc-gen-lua的程序, 他應(yīng)該是+x 的權(quán)限(chmod +x plugin/protoc-gen-lua)
第三步 , 將protobuf 集成到quick 中
protoc-gen-lua/protobuf/ 目錄就是要編譯到quick-cocos2d-x目錄里面的部分。
現(xiàn)在, 我們只需要 protoc-gen-lua/protobuf/pb.c 這個(gè)文件
先確定自己的quick-cocos2d-x lua擴(kuò)展目錄:
1 | /quick-cocos2d-x/lib/cocos2d-x/scripting/lua/lua_extensions/
|
所有l(wèi)ua 的c/c++現(xiàn)成擴(kuò)展,都可以直接放到這里。
將pb.c這個(gè)文件復(fù)制到 lua_extension目錄下, 最好獨(dú)立一個(gè)目錄, 免得擴(kuò)展多了亂。
這是我的目錄結(jié)構(gòu):
1 | ./quick-cocos2d-x/lib/cocos2d-x/scripting/lua/lua_extensions/protobuf/pb.c
|
然后開(kāi)始修改擴(kuò)展程序配置文件, lua_extensions.c
路徑為:
1 | ./quick-cocos2d-x/lib/cocos2d-x/scripting/lua/lua_extensions/lua_extensions.c
|
目前是一個(gè)不足60行的小文件, 我打算全部貼進(jìn)來(lái):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #include "lua_extensions.h"
#if __cplusplus
extern "C" {
#endif
// cjson
#include "cjson/lua_cjson.h"
// zlib
#include "zlib/lua_zlib.h"
// lpack
#include "lpack/lpack.h"
// socket
#include "socket/luasocket.h"
#include "socket/mime.h"
#include "socket/socket_scripts.h"
// filesystem
#include "filesystem/lfs.h"
// lsqlite3
#include "lsqlite3/lsqlite3.h"
#include "protobuf/pb.c" //引用protobuf 庫(kù)文件
static luaL_Reg luax_exts[] = {
{ "cjson" , luaopen_cjson_safe},
{ "zlib" , luaopen_zlib},
{ "pack" , luaopen_pack},
{ "socket.core" , luaopen_socket_core},
{ "mime.core" , luaopen_mime_core},
{ "lfs" , luaopen_lfs},
{ "lsqlite3" , luaopen_lsqlite3},
{NULL, NULL}
};
void luaopen_lua_extensions(lua_State *L)
{
// load extensions
luaL_Reg* lib = luax_exts;
lua_getglobal(L, "package" );
lua_getfield(L, -1, "preload" );
for (; lib->func; lib++)
{
lua_pushcfunction(L, lib->func);
lua_setfield(L, -2, lib->name);
}
lua_pop(L, 2);
// load extensions script
luaopen_socket_scripts(L);
luaopen_pb(L); //這是加入的protobuf 擴(kuò)展注冊(cè)名
}
#if __cplusplus
} // extern "C"
#endif
|
至此 , protobuf 擴(kuò)展部分就算擴(kuò)展完成了。
確認(rèn)是否成功支持 , 可以在quick 項(xiàng)目最先被調(diào)用的lua文件中追加 require "pb" 做測(cè)試。
*但這時(shí)候通過(guò)protoc 轉(zhuǎn)碼后得到的lua文件還不能被解析。
第四步 從項(xiàng)目中包含protobuf的 lua庫(kù)
protoc-gen-lua/protobuf/這個(gè)目錄下面, 還有大量的.lua文件, 是用來(lái)支持proto轉(zhuǎn)碼后的文件解析調(diào)用的。 不能少了這些文件。
復(fù)制protoc-gen-lua/protobuf文件夾 到項(xiàng)目中 scripts目錄下。
目錄結(jié)構(gòu)應(yīng)該是這樣的:
1 | [PROJECT]/scripts/protobuf/*.lua
|
然后, 需要告訴框架,從哪里可以引用到它。
修改main.lua 在require("appxxxxxx") 上面 , 加入下面的代碼:
1 | package.path = package.path .. ";./protobuf/?.lua;./scripts/protobuf/?.lua;"
|
這個(gè)方法, 能保證程序在被編譯到手機(jī)之后仍然可以繼續(xù)訪問(wèn)這個(gè)庫(kù)。
***千萬(wàn)別把轉(zhuǎn)碼的proto文件放到[PROJECT]/scripts/protobuf 目錄里面.不信可以試試。
現(xiàn)在, 項(xiàng)目支持protobuf 文件的解析了。
第五步 重新編譯player-x
如果不習(xí)慣用player-x調(diào)試, 這個(gè)步驟不是必須的。
進(jìn)入player-x qt源碼目錄 :
1 | cd quick-cocos2d-x/player/proj.qt
|
使用qmake 文件執(zhí)行quick-x.pro 文件
繼續(xù):
make
等待結(jié)束, 將得到的quick-x-player文件,
放到:quick-cocos2d-x/player/bin/mac/ 目錄下, 這樣sublime text 裝QuickXDev 擴(kuò)展的直接可以用。
**如果是mac os 10.9 系統(tǒng), 可能編譯不過(guò)去player-x程序。 我遇到了這個(gè)問(wèn)題。
會(huì)提示錯(cuò)誤 pb.c:28:10: fatal error: 'endian.h' file not found
如果錯(cuò)誤信息相同, 修改文件:
1 | ./quick-cocos2d-x/lib/cocos2d-x/scripting/lua/lua_extensions/protobuf/pb.c
|
查找行:
臨時(shí)變更為:
1 | #include <machine/endian.h>
|
然后重新編譯 player-x
make 就足夠了
make
**player-x 編譯完畢后, 千萬(wàn)要將endian.h 引用改回原來(lái)的 #include <endian.h> , 否則打包到手機(jī)的時(shí)候又回提示文件找不到了。