Ove*_*erv 1 java java-native-interface lua android
我正在为我的Android应用程序开发一个Lua包装器,这将允许我编写Lua代码来加速开发.我创建了一个名为lua的静态类,其函数类似于newState和pushString.我通过指向lua_State的指针传递一个long来管理Lua状态.正如您所知,我不需要任何可以使交互更容易的花哨的东西,比如推送变量的重载.
现在,问题是将Java函数绑定到Lua变量.我想过几种方法可以做到这一点,但它们都很难看.
而不是函数,将带有对Java函数的引用的表作为userdatum传递,并使用__call元方法来处理调用"函数".
改变Lua内部包含带Lua C函数的Java引用.
还有什么更好的办法吗?或者我应该采用第二种方法?(我意识到第一种方法很荒谬,但无论如何它在我的脑海中表现出来.)
你可以看看我的简单项目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)
| 归档时间: |
|
| 查看次数: |
2515 次 |
| 最近记录: |