为Lua绑定C对象,一种可行的方法是为C对象添加一个壳,lua 的 userdata 中仅仅保存 C 对象指针。然后给 userdata 设置 gc 元方法,在被回收时,正确调用 C 对象的销毁函数。 对于这种方法,userdata的行为跟lua表的行为是不一致的,例如向lua中绑定了一个socket对象,应用程序在获得了socket对象之后,很可能需要设置socke...
这时候,开发者需要了解如何手动编写Lua绑定C代码。 绑定原理 Lua提供了一组API来创建和操作C和Lua之间的绑定,通常涉及到创建C函数,注册到Lua状态机,然后在Lua脚本中可以像调用普通Lua函数一样调用它们。 手动绑定的步骤 编写C函数遵循Lua的C函数调用约定。 将这些C函数注册到Lua环境中,通常是使用lua_pushcfunction和...
// lua-binding-test.cppextern"C"{// Lua头文件必须以C方式包含#include"lua.h"#include"lualib.h"#include"lauxlib.h"externintluaopen_mylib(lua_State*);}/// 待运行的脚本constchar*SCRIPT=R"(print("mylib.addOne(1.0) = "..tostring(mylib.addOne(1.0)))";intmain(){auto*L=luaL_newstat...
为Lua绑定C对象,一种可行的方法是为C对象添加一个壳,lua 的 userdata 中仅仅保存 C 对象指针。然后给 userdata 设置 gc 元方法,在被回收时,正确调用 C 对象的销毁函数。 对于这种方法,userdata的行为跟lua表的行为是不一致的,例如向lua中绑定了一个socket对象,应用程序在获得了socket对象之后,很可能需要设置socke...
如何绑定 C/C++ 对象到 Lua 里?通常是创建一个 userdata ,存放 C/C++ 对象指针,然后给 userdata 添加元表,用 index 元方法映射 C/C++ 中的对象方法。 也有另一个手段,直接用 lightuserdata 保存 C/C++ 对象指针放到 Lua 中,在 Lua 中创建一个 table 附加元表来来包装这个指针,效果是类似的。区别在于对象...
//加载lua脚本文件 int luaL_loadfile(lua_State *L, const char *filename); lua 和c/c++的数据交互通过"栈"进行 ,操作数据时,首先将数据拷贝到"栈"上,然后获取数据,栈中的每个数据通过索引值进行定位,索引值为正时表示相对于栈底的偏移索引,索引值为负时表示相 对于栈顶的偏移索引,索引值以1或-1为起始...
可以看到cocos2d-x已经为我们留出了注册自定义C函数的位置,在注释代码后面这么写就可以了: lua_State *L = stack->getLuaState();lua_register(L,"test_lua_bind", test_lua_bind); 也可以通过ScriptEngineManager类从头取得当前的LuaEngine对象,然后再getLuaStack()方法得到封装的LuaStack对象,再调用getLuaState...
在API设计实践系列的第一篇文章中,作者分享了关于Lua绑定C/C++ API的基础内容,重点是性能分析和基础数据类型绑定。通过实际操作,作者探讨了如何使用Swig将C/C++函数与Lua语言集成,并使用Callgrind工具进行性能测试。文章首先介绍了作者的背景,即在一个特效SDK项目中,团队为内部和第三方开发者提供了C/...
.addCFunction ("cfunc", cFunc) .endNamespace (); Variables在注册时,可以通过传递第二个参数为false,确保Variables不会在Lua被修改,默认第二个参数是true。Properties在注册时,若不传递set函数,则在脚本中是read-only。 通过上面注册后,则下面表达式在Lua是有效的: test -- a namespace,实质就是一个...
近为了总结Lua绑定C/C++对象的各种方法、第三方库和原理,学习了LuaBridge库为Lua绑定C/C++对象,下面是学习笔记,实质是对该库的Reference Manual基本上翻译了一遍,学习过程中测试代码,放在我的github上。 LuaBridge的主要特点 源码只有头文件,没有.cpp文件,没有MakeFile,使用时只需一个#include即可。