• Quick-Cocos2d-x 使用tolua工具导出C++的类给Lua调用


    记得很久以前,刚开始接触Quick,那时候尝试过一次这样的操作,不过失败了。

    因为那时候还年幼,对这里面的一套机制不是太熟悉。现在回头再做这样的事,遇到了问题,但是都很好的根据自己的理解给解决了。

    现在记录下,我tolua成功的过程,在写blog的过程中,更熟练其中的原理。

    PS:网上关于quick tolua的blog都有点过时了(dualface的quick官网文章),具体的过程,还是要自己多注意。

    我是基于Quick  2.2.1-rc版本实现的。

    ————————————————————————————————————————————————————————————

    首先quick项目中找到:如下图红线框的两个重要文件夹。

    进入第一个cocos2d-x文件夹:

    继续进入一层文件夹cocos2dx,创建我们自定义的类,如下图我红线框住的类:

    MyAdder的实现是2个整数的加法实现如下:

    H文件:

    1 #ifndef MY_ADDER
    2 #define MY_ADDER
    3 
    4 class MyAdder
    5 {
    6 public:
    7     static int addTwoNumber(int a, int b);
    8 };
    9 #endif

    CPP文件:

    1 #include "MyAdder.h"
    2 
    3 int MyAdder::addTwoNumber(int a, int b)
    4 {
    5     return a+b;
    6 }

    创建好了以后,需要注意一点,非常重要的一点:

    android.mk文件的修改:

    mk文件的位置:

    就是这个mk文件。

    mk文件的作用是什么?简单一句:配置需要编译h,cpp文件,最终生成动态库or静态库,android通过System.loadLibrary("game");

    加载(动态库or静态库)到android平台中,然后Lua脚本就可以调用什么CCSprite等等Cocos2dx的库函数了。

    所以我也需要配置我自己定义的h,cpp文件。所以:如下:

    这样,在android项目下,build_native.bat的时候,就可以把我们的类文件也编译到libgame.so包中去了。

    至于mk文件的详细介绍,请看这里:点击跳转

    到这里,思考下,我完成了那些步骤。

    1_成功将我自己定义的类加载到了.so包中,也就是当成功加载了so包后,我定义的类也就在内存中了,但是lua怎么调用呢?

    接下来需要做的事,调用我加载到内存中的so文件。

    首先根据我的类创建一个tolua文件。

    如何编写tolua文件?网上有具体的规则。不会的话,可以参考别人的转换规则。哪里看?here:

    这里面都是cocos2dx中的c++文件转换后的tolua文件,可以参考这里的。

    然后如下位置创建一个MyAdder.tolua文件:

    MyAdder.tolua文件的内容:

    class MyAdder : public CCObject
    {
    public:
        static int addTwoNumber(int a, int b);
    };

    MyAdder.tolua文件创建成功后,需要思考一下:

    如何让我定义的tolua文件可以成功的编译到文件中呢。。。需要在上图中的Cocos2d.tolua文件中,添加如下代码:

    好~ tolua文件也绑定成功了。开始使用tolua++的工具编译我定义的tolua文件了。

    使用tolua++的主要目的是:

    生成lua到c++文件调用的中间文件,也就是:

    %QUICK_COCOS2DX_ROOT%libcocos2d-xscriptingluacocos2dx_supportLuaCocos2d.cpp

    这个具体可以看:

    build.bat的实现是这样的:

    @echo off
    set DIR=%~dp0
    set TOLUA=%QUICK_COCOS2DX_ROOT%inwin32 olua++.exe

    cd /d "%DIR%"
    %TOLUA% -L "%DIR%basic.lua" -o "%QUICK_COCOS2DX_ROOT%libcocos2d-xscriptingluacocos2dx_supportLuaCocos2d.cpp" Cocos2d.tolua

    tolua的编译参数参考(方便理解上面的编译命令行参数):

    点击build.bat后,等待tolua++.exe编译生成LuaCocos2d.cpp文件,执行完后,看生成的LuaCocos2d.cpp文件,

    看文件里面时候有MyAdder关键字,如果有,则生成成功了。

    生成成功后,还需要在LuaCocos2d.cpp文件中添加一行(否则会在编译so包时报错):

    一切就绪,使用Eclipse,点击build_native.bat编译c++文件,这个编译过程中,编译了我定义的MyAdder文件,

    如果自定义的文件里面有语法错误,或者其它的什么错误,这个编译过程会中断的。

    它还会编译个重要的cpp文件,就是:LuaCocos2d.cpp文件。记得这里面有我定义的MyAdder类么,

    把LuaCocos2d.cpp文件编译通过后,我们在lua脚本中就可以调用我自定义的类了。

    整个编译通过后,生成了so文件,~~~~~

    clean project,run as android application~~~~

    上真机演示效果:

    忘了说我的脚本调用代码了:

    总结:

    既然是Lua调用C++,需要知道:

    1.创建我自己定义的h,cpp文件。

    2.将上面创建的h,cpp文件能成功加载编译到so包中,并载入程序运行的内存中(android.mk文件的增加我的类)

    3.创建lua跟c++相互调用的中间API转换文件(LuaCocos2d.cpp)

    4.既然要创建LuaCocos2d.cpp文件,需要用到tolua++工具

    5.既然需要用tolua++工具,就需要把自己的类的接口写成tolua文件

    6.写好tolua文件,添加到cocos2d.tolua编译目录中,用来编译生成LuaCocos2d.cpp文件

    7.自动生成LuaCocos2d.cpp成功,将我的类的定义写到LuaCocos2d.cpp文件中。( #include "MyAdder.h")

    8.android Project下编译生成so包,测试。。。

    ————————————————————OVER————————————————————————

  • 相关阅读:
    Jmeter之Constant Timer与constant throughput timer的区别(转)
    JMeter Exception: java.net.BindException: Address already in use: connect(转)
    jmeter的jtl日志转html报告常见报错笔记
    jmeter 启动jmeter-server.bat远程调用报错: java.io.FileNotFoundException: rmi_keystore.jks (系统找不到指定的文件。)
    jmeter5.0生成html报告 快速入门
    图片转字符画 【学习ing】
    python生成个性二维码学习笔记
    Processing 3!
    Python Selenium定位元素常用解决办法
    js 获取元素坐标 和鼠标点击坐标
  • 原文地址:https://www.cnblogs.com/vokie/p/3839983.html
Copyright © 2020-2023  润新知