我不得不加载java函数,这样就可以使用luaj从lua文件中调用它。
我现在做的是创建类似这样的东西:
在某些_package/aif.java中:
package some_package;
public class aif extends TwoArgFunction {
public aif() {
}
@Override
public LuaValue call(LuaValue modname, LuaValue env) {
LuaValue library = tableOf();
library.set("foo", new foo());
env.set("aif", library);
return library;
}
//the rest contains the implementations of java functions
}然后在lua文件中:
require "some_package/aif"
--etc ...然后在Main.java文件中:
public static void Main(String[] args) {
String script = "lib/some_lua_file.lua";
globals = JsePlatform.standardGlobals();
LuaValue chunk = globals.loadFile(script);
chunk.call( LuaValue.valueOf(script) );
}这段代码可以工作,但我想要的是,在lua文件中,我们不必使用"require“。我使用下面这行代码在c++中实现了这一点:
luaL_requiref(L, "aif", luaopen_aiflib, 1);我们可以在luaj这样做吗?我试过了:
globals.load(new aif());但在线程"main“org.luaj.vm2.LuaError中获取异常:期望索引,获取nil ( aif类的call函数中的变量env为nil)
有谁知道如何将aif设置为lua库,以便与luaj一起使用?
发布于 2013-04-26 20:10:40
在查看Lua库的luaj实现后,我找到了答案。
我修改了我的代码:
package some_package;
public class aif extends OneArgFunction{
public aif() {
}
@Override
public LuaValue call(LuaValue env) {
Globals globals = env.checkglobals();
LuaTable aif = new LuaTable();
aif.set("foo", new foo());
env.set("aif", aif);
globals.package_.loaded.set("aif", aif);
return aif;
}
//the rest contains the implementations of java functions
}我将aif类编码为TwoArgFunction是因为教程中说要这样做。现在有了上面的代码,就不需要在lua文件中使用类了
发布于 2013-10-28 16:18:02
您可以按如下方式编写MyXArgImpl:
package mypackage;
import org.luaj.vm2.LuaValue;
import org.luaj.vm2.lib.ZeroArgFunction;
public class MyZeroArgImpl extends ZeroArgFunction {
public LuaValue call() {
return valueOf("My Zero Arg Implementation");
}
}然后将其添加到您的LUA中,如下所示:
LuaValue globals = JsePlatform.standardGlobals();
globals.get("dofile").call( LuaValue.valueOf(yourScriptfile));
globals.set("callMyFunction", new MyZeroArgImpl());现在你可以在你的LUA脚本中调用你的函数,即使不需要(‘...’):
print(callMyFunction())发布于 2013-04-20 05:57:37
假设您正在加载的脚本有一个函数"receive_aif“
function receive_aif( aifObj )
--This is how you can invoke public function associated with aifObj
aifObj:someAifFunction()
end在java中,您可以将aif实例作为:(这应该适用于任何java对象)
aif aifObj = new aif()
LuaValue receive_aif_handle = globals.get("receive_aif");
LuaValue retvals = receive_aif_handle.call( CoerceJavaToLua.coerce( aifObj ) );我在使用“3.0Aplha-2”版本的应用程序中使用了类似的构造
https://stackoverflow.com/questions/16102578
复制相似问题