SWIG Lua: 使用%extend扩展类,能否添加%native方法?
2013-5-3 13:24:25
收藏:0
阅读:144
评论:2
我想要像这样的东西:
%扩展Foo{
%本地(Bar)int Bar(lua_State * L);
}
点赞
用户355516
在您的绑定的.i文件中,最后包含以下代码:
%wrapper %{
// 这段代码是用于将一个新的函数添加到对象元表中
void script_addNativeMethod(lua_State *L, const char *className, const char *methodName, lua_CFunction fn)
{
SWIG_Lua_get_class_registry(L); /* 获取注册表 */
lua_pushstring(L, className); /* 获取名称 */
lua_rawget(L,-2); /* 获取元表本身 */
lua_remove(L,-2); /* 整理(移除注册表)*/
// 如果元表不为null,则将该方法添加到“.fn”表中
if(lua_isnil(L, -1) != 1)
{
SWIG_Lua_get_table(L, ".fn");
SWIG_Lua_add_function(L, methodName, fn);
lua_pop(L, 2); /* 整理(移除元表和“.fn”表)*/
}
else
{
printf("[script_addNativeMethod(..)] - \"%s\"元表找不到。 方法\"%s\"将不会被添加\n", className,methodName);
return;
}
}
%}
这将在包装的 CPP 文件中添加一个名为“script_addNativeMethod”的新函数。您可以在“init”绑定代码中调用此函数,如下所示:
// 封装器以将本机Lua方法添加到现有的C ++类
%init %{
script_addNativeMethod(L, "MetatableName", "methodName", /*int function(lua_State *L)*/function);
%}
在这之上,在绑定文件中,您需要拥有要用作userdata方法的实际本机lua函数:
%{
int function(lua_State *L)
{
printf("Method called!\n");
return 0;
}
%}
我几乎是自己找出这个方法的,我想在这里发布它,因为这个页面在谷歌排名很高,这是一个相当不错的解决方案。这需要在使用SWIG编写的每个包装器绑定(*.i文件)中完成。
祝好运!
2014-01-25 00:50:25
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
Lua 没有任何真正的方法概念,只有一些带语法糖的函数表,因此您可以编写类似面向对象的 Lua 代码:
foo = test.Foo() # 将调用 C++ Foo 构造函数并返回包装(Lua)的 Foo myInt = foo:Bar()当您编写以下代码时:
myInt = foo:Bar()Lua 实际上执行的是:
myInt = foo.Bar(foo)这将导致 Lua 在 foo 元表中查找名为 Bar 的函数,并将其视为第一个参数提供给 foo 实例。因此,您需要执行以下类似的伪代码(未经测试,可能存在语法错误、参数顺序不正确等问题,但希望您能理解):
%native(Bar) int Bar(lua_State * L); %{ int Bar(lua_State*L) { //栈上应该有一个参数,即 Foo 的实例 Foo* foo = (Foo*)<get void* from L stack> int answer = foo.Bar(); // 将答案推入 L 栈中 lua_pushnumber(L, answer); return 1; } %} %luacode { test.Foo.Bar = test.Bar } ... %}%luacode 使 Bar 成为 Foo “类”的一部分,尽管我在这个领域有点生疏,您可能需要将 Bar 添加到 Foo 元表中,或者从 C 中执行该操作(请参见 SWIG 用户指南第 5.6 节以尝试执行 .i 文件的部分)。
很好奇那是否有效。