Quick-Cocos2d-x 集成 Google protobuf 方法

Quick-Cocos2d-x 集成 Google protobuf 方法

http://cn.cocos2d-x.org/tutorial/show?id=506

本文将向您介绍Quick-Cocos2d-x集成google protobuf的方法。  
 
第一步   需要最新的protobuf 类库和解析程序。 
下载地址: https://github.com/sean-lin/protoc-gen-lua
 
git clone  https://github.com/sean-lin/protoc-gen-lua.git 到任意的一个地方
 

然后,可以得到重要的两个目录

1
2
protoc-gen-lua/plugin/ 
protoc-gen-lua/protobuf/
 
第二步, 需要使用protoc —lua_out=. 这种方法, 将我们自己的*.proto 的文件解析成lua文件

plugin目录是提供将buffer 文件解析成lua 版本的类库, 需要python 支持。  如果已经编译了google 官方的protoc 那个程序, 只需要在系统PATH环境变量总追加plugin目录就好:

1
export PATH={protoc-gen-lua DIR }/plugin:$PATH
 
关于protoc的编译另请google .
 
如果解析不出lua文件来, 可以手动志信一下plugin/protoc-gen-lua的程序, 他应该是+x 的权限(chmod +x plugin/protoc-gen-lua)
 
细节的安装步骤可以参考  https://code.google.com/p/protoc-gen-lua/
 
第三步 , 将protobuf 集成到quick 中
protoc-gen-lua/protobuf/ 目录就是要编译到quick-cocos2d-x目录里面的部分。 
 
现在, 我们只需要 protoc-gen-lua/protobuf/pb.c 这个文件 
 

先确定自己的quick-cocos2d-x lua扩展目录:

1
/quick-cocos2d-x/lib/cocos2d-x/scripting/lua/lua_extensions/
 
所有lua 的c/c++现成扩展,都可以直接放到这里。 
  
将pb.c这个文件复制到 lua_extension目录下, 最好独立一个目录, 免得扩展多了乱。 
  

这是我的目录结构:

1
./quick-cocos2d-x/lib/cocos2d-x/scripting/lua/lua_extensions/protobuf/pb.c
  
然后开始修改扩展程序配置文件, lua_extensions.c
 

路径为:

1
./quick-cocos2d-x/lib/cocos2d-x/scripting/lua/lua_extensions/lua_extensions.c
 

目前是一个不足60行的小文件, 我打算全部贴进来:

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 库文件 
    
    
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 扩展注册名 
    
    
#if __cplusplus 
} // extern "C" 
#endif
至此 , protobuf 扩展部分就算扩展完成了。 
 
确认是否成功支持 , 可以在quick 项目最先被调用的lua文件中追加 require "pb" 做测试。 
 
*但这时候通过protoc 转码后得到的lua文件还不能被解析。 
 
第四步 从项目中包含protobuf的 lua库
protoc-gen-lua/protobuf/这个目录下面, 还有大量的.lua文件, 是用来支持proto转码后的文件解析调用的。 不能少了这些文件。 
 
复制protoc-gen-lua/protobuf文件夹 到项目中 scripts目录下。  
  

目录结构应该是这样的:

1
[PROJECT]/scripts/protobuf/*.lua
 
然后, 需要告诉框架,从哪里可以引用到它。 
 

修改main.lua 在require("appxxxxxx") 上面 , 加入下面的代码:

1
package.path = package.path .. ";./protobuf/?.lua;./scripts/protobuf/?.lua;"
 
这个方法, 能保证程序在被编译到手机之后仍然可以继续访问这个库。 
  
***千万别把转码的proto文件放到[PROJECT]/scripts/protobuf 目录里面.不信可以试试。
 
现在, 项目支持protobuf 文件的解析了。
 
第五步  重新编译player-x
如果不习惯用player-x调试, 这个步骤不是必须的。 
 

进入player-x qt源码目录 :

1
cd quick-cocos2d-x/player/proj.qt
 

使用qmake 文件执行quick-x.pro 文件 

1
qmake ./quick-x.pro
 
继续:
make 
 
等待结束, 将得到的quick-x-player文件, 
 
放到:quick-cocos2d-x/player/bin/mac/ 目录下, 这样sublime text 装QuickXDev 扩展的直接可以用。 
  
**如果是mac os 10.9 系统, 可能编译不过去player-x程序。 我遇到了这个问题。 
 
会提示错误  pb.c:28:10: fatal error: 'endian.h' file not found 
 

如果错误信息相同, 修改文件:

1
./quick-cocos2d-x/lib/cocos2d-x/scripting/lua/lua_extensions/protobuf/pb.c
 

查找行:

1
#include <endian.h>
  

临时变更为:

1
#include <machine/endian.h>
  
然后重新编译 player-x 
 
make 就足够了 
 
make
 
**player-x 编译完毕后, 千万要将endian.h 引用改回原来的 #include <endian.h> , 否则打包到手机的时候又回提示文件找不到了。 

你可能感兴趣的:(Quick-Cocos2d-x 集成 Google protobuf 方法)