将Java函数绑定到Lua的方法?

Ove*_*erv 1 java java-native-interface lua android

我正在为我的Android应用程序开发一个Lua包装器,这将允许我编写Lua代码来加速开发.我创建了一个名为lua的静态类,其函数类似于newStatepushString.我通过指向lua_State的指针传递一个long来管理Lua状态.正如您所知,我不需要任何可以使交互更容易的花哨的东西,比如推送变量的重载.

现在,问题是将Java函数绑定到Lua变量.我想过几种方法可以做到这一点,但它们都很难看.

  1. 而不是函数,将带有对Java函数的引用的表作为userdatum传递,并使用__call元方法来处理调用"函数".

  2. 改变Lua内部包含带Lua C函数的Java引用.

还有什么更好的办法吗?或者我应该采用第二种方法?(我意识到第一种方法很荒谬,但无论如何它在我的脑海中表现出来.)

Mic*_*man 5

你可以看看我的简单项目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");
Run Code Online (Sandbox Code Playgroud)

缺点是有时你不能传递print函数参数(因为它是一个用户数据,即使它有一个__call元方法).幸运的是,它可以通过创建一个纯Lua函数在Lua中解决,如下所示:

do
    local oldprint = print
    function print(...) oldprint(...) end
end
Run Code Online (Sandbox Code Playgroud)