首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将java库函数加载到Luaj

将java库函数加载到Luaj
EN

Stack Overflow用户
提问于 2013-04-19 18:30:34
回答 3查看 4.1K关注 0票数 3

我不得不加载java函数,这样就可以使用luaj从lua文件中调用它。

我现在做的是创建类似这样的东西:

在某些_package/aif.java中:

代码语言:javascript
复制
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文件中:

代码语言:javascript
复制
require "some_package/aif"
--etc ...

然后在Main.java文件中:

代码语言:javascript
复制
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++中实现了这一点:

代码语言:javascript
复制
luaL_requiref(L, "aif", luaopen_aiflib, 1);

我们可以在luaj这样做吗?我试过了:

代码语言:javascript
复制
globals.load(new aif());

但在线程"main“org.luaj.vm2.LuaError中获取异常:期望索引,获取nil ( aif类的call函数中的变量env为nil)

有谁知道如何将aif设置为lua库,以便与luaj一起使用?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-26 20:10:40

在查看Lua库的luaj实现后,我找到了答案。

我修改了我的代码:

代码语言:javascript
复制
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文件中使用类了

票数 4
EN

Stack Overflow用户

发布于 2013-10-28 16:18:02

您可以按如下方式编写MyXArgImpl:

代码语言:javascript
复制
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中,如下所示:

代码语言:javascript
复制
LuaValue globals = JsePlatform.standardGlobals();
globals.get("dofile").call( LuaValue.valueOf(yourScriptfile));
globals.set("callMyFunction", new MyZeroArgImpl());

现在你可以在你的LUA脚本中调用你的函数,即使不需要(‘...’):

代码语言:javascript
复制
print(callMyFunction())
票数 7
EN

Stack Overflow用户

发布于 2013-04-20 05:57:37

假设您正在加载的脚本有一个函数"receive_aif“

代码语言:javascript
复制
function receive_aif( aifObj )

    --This is how you can invoke public function associated with aifObj     
    aifObj:someAifFunction()

end

在java中,您可以将aif实例作为:(这应该适用于任何java对象)

代码语言:javascript
复制
aif aifObj = new aif()
LuaValue receive_aif_handle = globals.get("receive_aif");
LuaValue retvals = receive_aif_handle.call( CoerceJavaToLua.coerce( aifObj ) );

我在使用“3.0Aplha-2”版本的应用程序中使用了类似的构造

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16102578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档