用tolua++把c++类转LUA调用的类库经历分享

                        c++类转成LUA调用的类

第一步:准备需要用的c++类

    例子如下:

    c++头文件定义 

#ifndef __testlua__
#define __testlua__

#include <iostream>
#include <string>
#include <string.h>
using namespace std;
class testlua
{
private:

static std::string testluatxt ;

public:
static std::string getname();
static void setname(string txt);
};
#endif /* defined(__testlua__) */

    c++ CPP文件定义

#include "testlua.h"

string testlua::getname()
{
return "testlua";
}

void testlua::setname(string txt)
{
testluatxt =txt;

}

  

第二步:准备编译的pkg文件

pkg文件里面得写法和c++的头文件类似,只不过没有关键字,如下:

class testlua
{
static std::string getname();
static void setname(std::string value);
};

第三步:用tolua++编译okg文件

用命令行进入tolua++所在文件夹,用命令编译,命令:./tolua++ -o testlua.cpp testlua.pkg 。运行完成后会生成所需要得testlua.cpp文件。

testlua.cpp文件中得代码如下:

/*
** Lua binding: testlua
** Generated automatically by tolua++-1.0.92 on Thu Sep 4 14:18:20 2014.
*/

#ifndef __cplusplus
#include "stdlib.h"
#endif
#include "string.h"

#include "tolua++.h"

/* Exported function */
TOLUA_API int tolua_testlua_open (lua_State* tolua_S);

/* function to register type */
static void tolua_reg_types (lua_State* tolua_S)
{
tolua_usertype(tolua_S,"testlua");
}

/* method: getname of class testlua */
#ifndef TOLUA_DISABLE_tolua_testlua_testlua_getname00
static int tolua_testlua_testlua_getname00(lua_State* tolua_S)
{
#ifndef TOLUA_RELEASE
tolua_Error tolua_err;
if (
!tolua_isusertype(tolua_S,1,"testlua",0,&tolua_err) ||
!tolua_isnoobj(tolua_S,2,&tolua_err)
)
goto tolua_lerror;
else
#endif
{
testlua* self = (testlua*) tolua_tousertype(tolua_S,1,0);
#ifndef TOLUA_RELEASE
if (!self) tolua_error(tolua_S,"invalid ‘self‘ in function ‘getname‘", NULL);
#endif
{
std::string tolua_ret = (std::string) self->getname();
tolua_pushcppstring(tolua_S,(const char*)tolua_ret);
}
}
return 1;
#ifndef TOLUA_RELEASE
tolua_lerror:
tolua_error(tolua_S,"#ferror in function ‘getname‘.",&tolua_err);
return 0;
#endif
}
#endif //#ifndef TOLUA_DISABLE

/* method: setname of class testlua */
#ifndef TOLUA_DISABLE_tolua_testlua_testlua_setname00
static int tolua_testlua_testlua_setname00(lua_State* tolua_S)
{
#ifndef TOLUA_RELEASE
tolua_Error tolua_err;
if (
!tolua_isusertype(tolua_S,1,"testlua",0,&tolua_err) ||
!tolua_iscppstring(tolua_S,2,0,&tolua_err) ||
!tolua_isnoobj(tolua_S,3,&tolua_err)
)
goto tolua_lerror;
else
#endif
{
testlua* self = (testlua*) tolua_tousertype(tolua_S,1,0);
std::string value = ((std::string) tolua_tocppstring(tolua_S,2,0));
#ifndef TOLUA_RELEASE
if (!self) tolua_error(tolua_S,"invalid ‘self‘ in function ‘setname‘", NULL);
#endif
{
self->setname(value);
}
}
return 0;
#ifndef TOLUA_RELEASE
tolua_lerror:
tolua_error(tolua_S,"#ferror in function ‘setname‘.",&tolua_err);
return 0;
#endif
}
#endif //#ifndef TOLUA_DISABLE

/* Open function */
TOLUA_API int tolua_testlua_open (lua_State* tolua_S)
{
tolua_open(tolua_S);
tolua_reg_types(tolua_S);
tolua_module(tolua_S,NULL,0);
tolua_beginmodule(tolua_S,NULL);
tolua_cclass(tolua_S,"testlua","testlua","",NULL);
tolua_beginmodule(tolua_S,"testlua");
tolua_function(tolua_S,"getname",tolua_testlua_testlua_getname00);
tolua_function(tolua_S,"setname",tolua_testlua_testlua_setname00);
tolua_endmodule(tolua_S);
tolua_endmodule(tolua_S);
return 1;
}

#if defined(LUA_VERSION_NUM) && LUA_VERSION_NUM >= 501
TOLUA_API int luaopen_testlua (lua_State* tolua_S) {
return tolua_testlua_open(tolua_S);
};
#endif

第四步:把生成好的文件处理好后放入工程中

在添加一个testlua.h文件,文件内容如下:

extern "C"

{

#include "lua.h"

#include "tolua++.h"

#include "tolua_fix.h"

}

TOLUA_API int luaopen_testlua(lua_State* tolua_s);

然后在testlua.cpp文件中引入该头文件,在工程初始化的时候调用luaopen_testlua该方法。

第五步:在LUA中调用

在lua中调用如下:

if testlua then
local getnametxt = testlua:getname()
print("nametxt: " .. tostring(getnametxt) .. "\n")
else
print("LUA ERROR:没有获取到")
end

以上是个人在项目中用的方法,如果有不对的地方希望大神指点,也欢迎大家一起学习讨论。QQ:837138108

时间: 2024-11-13 08:09:53

用tolua++把c++类转LUA调用的类库经历分享的相关文章

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

记得很久以前,刚开始接触Quick,那时候尝试过一次这样的操作,不过失败了. 因为那时候还年幼,对这里面的一套机制不是太熟悉.现在回头再做这样的事,遇到了问题,但是都很好的根据自己的理解给解决了. 现在记录下,我tolua成功的过程,在写blog的过程中,更熟练其中的原理. PS:网上关于quick tolua的blog都有点过时了(dualface的quick官网文章),具体的过程,还是要自己多注意. 我是基于Quick  2.2.1-rc版本实现的. ————————————————————

cocos2dx 2.x版本:简化提炼tolua++绑定自定义类到lua中使用

cocos2dx的3.x版本已经提供了更好地绑定方式,网上有很多相关的教程,这里给一个链接:http://www.cocoachina.com/bbs/read.php?tid=196416. 由于目前我们的项目使用的是2.x版本的,且已经开发了一半了,这时候不适合转3.x的版本,于是只能用2.x的老方法tolua++来实现绑定.这就有一个蛋疼的问题,太麻烦!每次都要写pkg.使用tolua++.exe解释器编译生成新的cpp,在其中添加自己的类的头文件引用,然后把这个新的cpp文件覆盖到lib

cocos进阶教程(1)Lua调用自定义C++类和函数的最佳实践

第一层:纯C环境下,把C函数注册进Lua环境 a.lua 文件 print(foo(99)) a.c 文件 #include <lua.h> #include <lualib.h> #include <lauxlib.h> int foo(lua_State *L) { int n = lua_tonumber(L, 1); lua_pushnumber(L, n + 1); return 1; } int main() { lua_State *L = lua_ope

Cocos2d-x下Lua调用自定义C++类和函数的最佳实践

原文地址:http://segmentfault.com/a/1190000000631630 关于cocos2d-x下Lua调用C++的文档看了不少,但没有一篇真正把这事给讲明白了,我自己也是个初学者,摸索了半天,总结如下: cocos2d-x下Lua调用C++这事之所以看起来这么复杂.网上所有的文档都没讲清楚,是因为存在5个层面的知识点: 1.在纯C环境下,把C函数注册进Lua环境,理解Lua和C之间可以互相调用的本质2.在cocos2d-x项目里,把纯C函数注册进Lua环境,理解cocos

【转】Cocos2d-x下Lua调用自定义C++类和函数的最佳实践

转自:http://segmentfault.com/blog/hongliang/1190000000631630 关于cocos2d-x下Lua调用C++的文档看了不少,但没有一篇真正把这事给讲明白了,我自己也是个初学者,摸索了半天,总结如下: cocos2d-x下Lua调用C++这事之所以看起来这么复杂.网上所有的文档都没讲清楚,是因为存在5个层面的知识点: 1.在纯C环境下,把C函数注册进Lua环境,理解Lua和C之间可以互相调用的本质 2.在cocos2d-x项目里,把纯C函数注册进L

CC3.2+Lua(8) ——Lua调用自定义C++类

[唠叨] 本节要讲的是如果将自己写的C++类注册进Lua环境,让Lua去调用自定义的C++类. 网上有很多都是用原始的tolua++工具来注册C++类的,我看了很多这样的教程,感觉操作起来十分麻烦,而且也很难看懂他们到底在讲什么. 其实,在cocos2dx v3.2版本中,提供了bindings-generator脚本来封装toLua++的用法,从而节省了工作量. [致谢] http://segmentfault.com/blog/hongliang/1190000000718145 (讲得非常

创建C++自定义类让Lua脚本调用

这里将介绍使用tolua++将自定义的C++类嵌入,让lua脚本使用 一般过程: 自定义类 -> 使用tolua++工具编译到LuaCoco2d.cpp中 -> lua调用 步骤一:自定义一个C++类,我定义一个类名为:MySprite MySprite.h MySprite.cpp 步骤二:根据自定义类创建一个.pkg文件,我们把自定义的MySprite类定义到.pkg文件中 注意:1>,只要根据自定类.h中的内容,至于.cpp的实现,binding后lua会自动调用类的函数 2>

Cocos2d-x下Lua调用自定义C++类和函数的最佳实践 -- 转

原地址: http://blog.segmentfault.com/hongliang/1190000000631630 Cocos2d-x下Lua调用自定义C++类和函数的最佳实践 关于cocos2d-x下Lua调用C++的文档看了不少,但没有一篇真正把这事给讲明白了,我自己也是个初学者,摸索了半天,总结如下: cocos2d-x下Lua调用C++这事之所以看起来这么复杂.网上所有的文档都没讲清楚,是因为存在5个层面的知识点: 1.在纯C环境下,把C函数注册进Lua环境,理解Lua和C之间可以

Lua调用自定义C++类

弄了一天终于会Lua调用自定义C++类.不容易啊. 我的电脑是64位的,装了64的Python不行,装了32位的就可以了,靠!下面是报错信息 python pyyaml Cheetah全都是装32位的,其中python版本是用2.7.8,是可以的. Cocos2d-x v3.2 Cocos Code IDE 1.2.0 NDK r9d dos2unix,windows下可能在执行脚本时有这个错误.是创建项目时没有了这个文件,可以去cocos2dx里面复制一个,如 E:\cocos2d-x-3.2