如何将Java函数绑定到Lua?

我正在为我的 Android 应用编写一个 Lua 包装器,它将允许我编写 Lua 代码以加速开发。我已经创建了一个名为 _lua_ 的静态类,其中包含类似于 _newState__pushString_ 的函数。通过传递一个长整型变量与指向 lua_State 的指针,我管理 Lua 状态。正如您所看到的,我不需要任何使交互更加容易的高级功能,比如推入变量的重载。

现在,问题在于将 Java 函数绑定到 Lua 变量。我想到了几种方法来实现这一点,但它们都很丑陋。

  1. 不使用函数,而是传递一个表格,并将 Java 函数的引用作为用户数据,让 __call 元方法负责调用“函数”。

  2. 修改 Lua 的内部,包含带有 Lua C 函数的 Java 引用。

是否有更好的方法来解决这个问题?还是我应该采用第二种方法?(我意识到第一种方法很荒谬,但它仍然在我脑海中表现出来。)

原文链接 https://stackoverflow.com/questions/5339985

点赞
stackoverflow用户221509
stackoverflow用户221509

你可以查看我的简单项目 AndroLua。它包含了使用 Android NDK 编译的 Lua 和 LuaJava。由于它使用了 LuaJava,所以可以通过 userdata 将 Java 函数绑定到 Lua 中,方式与你所说的类似。下面是一个示例,演示如何覆盖 print 函数以将文本输出到 TextView 中:

JavaFunction print = new JavaFunction(L) {
    @Override
    public int execute() throws LuaException {
        StringBuilder sb = new StringBuilder();
        for (int i = 2; i <= L.getTop(); i++) {
            int type = L.type(i);
            String val = L.toString(i);
            if (val == null)
                val = L.typeName(type);
            sb.append(val);
            sb.append("\t");
        }
        sb.append("\n");
        status.append(sb.toString());
        return 0;
    }
};
print.register("print");

缺点是有时无法将 print 作为函数参数传递(因为它是一个 userdata,尽管它有一个 __call 超载方法)。幸运的是,可以通过在 Lua 中创建一个纯函数来解决这个问题,如下所示:

do
    local oldprint = print
    function print(...) oldprint(...) end
end
2011-03-17 14:47:58
stackoverflow用户238180
stackoverflow用户238180

我决定使用__lua_pushcclosure_,因为它允许在函数中“存储”任意值,并且可以使用__lua_upvalueindex_宏来检索这些值。

2011-03-18 16:41:13
stackoverflow用户151501
stackoverflow用户151501
2011-03-19 04:24:43