cocos2dx3.2+mac+LUA 安卓移植

一、搭配环境:
1、下载coco2dx3.2
2、下载jdk
3、下载adt (其中包含sdk和eclipse两个文件,不需要安装)
4、下载ndk 
5、下载Apahce ant
然后设置以上变量的的环境路径,(没有" / ")
注意sdk为:

#Add ANDROID_SDK_ROOT
export ANDROID_SDK_ROOT=/Users/Lss/Downloads/adt-bundle/sdk
链接:http://my.oschina.net/u/1036620/blog/294322
http://blog.csdn.net/u013174689/article/details/39938551

二、创建新项目
C++:1、cocos new hello –p com.my.MyGame –l cpp –d ~/projects

2、然后
cd projcets/hello/proj.android
    python build_native.py
3、配置eclipse环境
LUA:1、cocos new tegame -p com.test.app  -l lua –d ~/projects
2、然后,编译so文件
先用终端cd进入刚刚新建的项目目录,然后再运行命令
cocos compile -p android
3、配置eclipse环境
三、eclipse配置,见以下链接
四,安卓的PB文件问题:
1、无法读取到被打包进Android asset文件夹中的.pb文件
    2、无法注册,解决代码如下:

最后是Android平台,按照项目结构和pbc源码的位置设置好mk文件中的src和include后,编译ok,但是运行时却出现了注册.pb文件出错的问题,看了一下pbc的lua代码,发现注册.pb文件是通过lua函数库中的io.open进行文件读取的,而cocos2d-x中的这部分的lua实现并没有重写过,就是直接封装的fopen, fread, fclose等,这样自然无法读取到被打包进Android asset文件夹中的.pb文件了!最开始考虑使用cocos2d-x的FileUtils替换掉pbc-lua中的io.open加载文件,想法就是既不修改cocos2d-x框架层的io.open实现,也不去重写pbc-lua的文件io操作,尽量都在用户应用层解决。看了一下FileUtils的lua导出,发现能够进行文件读取操作的只有一个getStringFromFile可以用,测试了一下发现还是不能正常完成pbc-lua的注册pb操作,断点调试了一下FileUtils的getStringFromFile以及pbc-lua的相关实现代码,发现问题出在文件读取后的数据传递给lua的过程中,由于cocos2d-x直接实现getStringFromFile的lua-binding中,对加载后的const char*进行了lua_pushlstring(L, s, strlen(s))的操作(由tolua的封装间接调用),而就是因为最后的strlen,导致读取.pb二进制文件时,错误的以文件中的0作为字符串结束标记错误的传递了整个二进制文件的长度,最终导致pbc-lua register时的错误。明确问题后解决就好办了,自己注册一个通过FileUtils实现的专门负责io二进制文件的c函数给lua调用:
static int bsReadFile(lua_State *L)
2 {
3 const char *buff = luaL_checkstring(L, -1);
4 Data data = CCFileUtils::getInstance()->getDataFromFile(buff);
5 lua_pushlstring(L, (const char*)data.getBytes(), data.getSize());
6 return 1; /* number of results */
7 }
8
9 ...
10
11 lua_register(tolua_S, "bsReadFile", bsReadFile);
pb = require "protobuf"
2 local pbFilePath = cc.FileUtils:getInstance():fullPathForFilename("res/addressbook.pb")
3 cclog("PB file path: "..pbFilePath)
4 -- local f = assert(io.open(pbFilePath , "rb"))
5 -- local buffer = f:read "*a"
6 local buffer = bsReadFile(pbFilePath)
7 pb.register(buffer)
8 -- f:close()

方法见:http://blog.k-res.net/archives/1741.html
http://www.58player.com/blog-2537-86362.html
http://blog.csdn.net/vpingchangxin/article/details/24458051
注意:文件不要LUA的后缀,以及路径完整性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值