标签: luaj

Luaj:如何导入或需要Lua函数库

在Java LuaJ库,我想知道如何要求或通过Java中的LUA关闭另一个名为LUA脚本导入功能的LUA脚本.例如,这不起作用:

public static LuaValue runInputStreamLua(InputStream inputStream) throws Exception {
    Prototype luaScriptPrototype = LuaC.instance.compile(inputStream, "");
    Globals luaScriptStandardGlobals = JsePlatform.standardGlobals();
    luaScriptStandardGlobals.loadfile("mycoolmathfunctions.lua");
    LuaClosure luaClosure = new LuaClosure(luaScriptPrototype, luaScriptStandardGlobals);
    return luaClosure.call();
}
Run Code Online (Sandbox Code Playgroud)

这里的输入流是指另一个lua的内容:

import 'mycoolmathfunctions'
-- or maybe require mycoolmathfunctions ?

return sum({1, 2, 3})
-- or maybe mycoolmathfunctions.sum({1, 2, 3}) ?
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?

java lua luaj

17
推荐指数
1
解决办法
2727
查看次数

如何将对象传递给公开的luaj函数?

我正在尝试使用Luaj + java构建一个控制器.我有以下java类

public class Duck {
  public void talk() { System.out.println("Duck quacks!"); }
  public void walk() { System.out.println("Duck walks!"); }
}

public class Person {
  public void talk() { System.out.println("Person talks!"); }
  public void walk() { System.out.println("Person walks!"); }
}
Run Code Online (Sandbox Code Playgroud)

以及控制器的以下lua脚本:

onTalk(obj) 
  obj:talk();
end

onWalk(obj)
   obj:walk();
end
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想定义一个控制器(用lua编写),我将保留所有程序的逻辑,我想将API从该控制器公开到我的java代码.我试图使用以下方法:

ScriptEngineManager sem     = new ScriptEngineManager();
ScriptEngine        engine  = sem.getEngineByExtension(".lua");
ScriptEngineFactory factory = engine.getFactory();

// Script defined above
CompiledScript cs = ((Compilable)engine).compile(MY_LUA_SCRIPT);
SimpleBindings b = new SimpleBindings();

b = newSimpletBindings();

LuaValue onWalkHandler …
Run Code Online (Sandbox Code Playgroud)

java lua callback luaj

8
推荐指数
1
解决办法
4117
查看次数

robovm 0.0.14 NullPointerException问题

我已将我的libgdx(1.3),maven,robovm项目从0.0.13迁移到0.0.14,以支持IOS 8设备.我根据发行说明修改了我的robovm.xml文件,可以在IOS 8设备上运行但在几个地方获得NullPointerException.我遇到的问题如下:

  • 声音,音乐和振动都不起作用.
  • 我得到luaj NullPointerException如下:(我试图在robovm.xml中链接org.luaj.**.*包但没有改变)

org.luaj.vm2.LuaError:checkOnSessionEndAchievements:5 vm错误:org.luaj.vm2.LuaClosure.exe的java.lang.NullPointerException(未知来源)atg.luaj.vm2.LuaClosure.call(未知来源)net. games.mobile.game.core.LuaScriptManager.runFunction(LuaScriptManager.java)at net.games.mobile.game.core.achievement.AchievementManager $ 3.run(AchievementManager.java)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor) .java)java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java)at java.lang.Thread.run(Thread.java)

  • 我在otto库的Bus.java"register"方法上得到了NullPointerException,但修复了它应用的解决方法.

我认为有些内容与0.0.14版本的反射行为有关,因为就我看来,异常与反射有关.顺便说一句,IOS 7.1设备上存在相同的NullPointerException问题,但"声音,音乐,振动"正在发挥作用.

我该如何解决这个NullPointerException问题?

感谢和问候

luaj libgdx robovm

6
推荐指数
0
解决办法
358
查看次数

使用luaj将参数传递给lua函数

我正在尝试使用LuaJ在Java程序中调用lua函数.当我没有向闭包传递任何参数时,它工作正常:

String script = "print 'Hello World!'";
InputStream input = new ByteArrayInputStream(script.getBytes());
Prototype prototype = LuaC.compile(input, "script");
LuaValue globals = JsePlatform.standardGlobals();
LuaClosure closure = new LuaClosure(prototype, globals);
closure.call();
Run Code Online (Sandbox Code Playgroud)

但是现在我正在尝试一个带有顶级函数的lua脚本,该函数接受一个参数而我无法弄清楚如何从Java中传入参数.这是我到目前为止所得到的:

String script = "function something(argument)\n"+
                            "test_string = 'Hello World!'\n"+
                            "print(test_string)\n"+
                            "print(argument)\n"+
                "end";

InputStream input = new ByteArrayInputStream(script.getBytes());
Prototype prototype = LuaC.compile(input, "script");
LuaValue globals = JsePlatform.standardGlobals();
LuaClosure closure = new LuaClosure(prototype, globals);
closure.invokemethod("something", CoerceJavaToLua.coerce("Foo"));
Run Code Online (Sandbox Code Playgroud)

这会导致invoke方法行出现异常:

org.luaj.vm2.LuaError:尝试索引?(函数值)

谢谢你的帮助!

java lua luaj

5
推荐指数
1
解决办法
2426
查看次数

LuaJ:无法在Lua脚本中调用'require'函数

我正在做一些奇怪的事情,导致这个错误.

以下简单示例失败:

--> thingy.lua
function doThing()
  print( "Thing has been done." );
end
Run Code Online (Sandbox Code Playgroud)

--> test.lua
require( "thingy" );
Run Code Online (Sandbox Code Playgroud)

当thingy.lua被执行时,没有问题.执行test.lua时,我看到以下错误:

script:2 module 'thingy' not found: thingy
no field package.preload['thingy']
thingy.lua
no class 'thingy'
Run Code Online (Sandbox Code Playgroud)

这两个文件都存在于同一目录中,我可以使用SciTE(运行Lua 5.1)运行这两个脚本而不会出错.这似乎是一个路径问题,所以我尝试将package.path设置为源文件的绝对路径.

注意:我设置路径,而不是附加,以便我可以确定SciTE没有成功,因为现有的相对路径"?.lua".

我在LauJ(使用我自己的程序)和SciTE中进行了测试,发现SciTE能够执行test.lua,而LuaJ仍然无法执行,并且一如既往地产生相同的错误.

我应该在Java代码中做些什么(或者不做)可能导致这种情况?我已成功从Lua脚本访问Java,而不是其他 Lua脚本.只要我手动运行包含它们的脚本,我就可以访问LuaJ中的全局变量和函数.

好的方法是,这是我用来执行脚本的Java代码.

// some fancy Java code
public void execute() throws ScriptException, LuaError
{
    try
    {
        FileReader reader = new FileReader( filename );
        Script_Engine.eval( reader );
        reader.close();
    }
    catch( FileNotFoundException fnfe )
    {
        fnfe.printStackTrace();
    } …
Run Code Online (Sandbox Code Playgroud)

lua luaj

5
推荐指数
1
解决办法
1877
查看次数

是否可以从宿主程序执行单个lua语句?

我正在尝试将基于lua的脚本系统嵌入到我的游戏引擎中.我希望脚本能够同时具有阻塞和非阻塞命令,例如:

character.walkTo(24, 359);  // Blocks until character arrives
c = 35; // Non blocking, execution goes on to the next statement
Run Code Online (Sandbox Code Playgroud)

由于"walkTo"需要"活动"超过1帧执行,我希望能够从Java主机而不是整个函数运行1个语句.这是因为拥有真正的多线程是不合适的,这是不需要的.

如果我只执行1个语句,并保持执行状态"暂停"直到下一个语句执行,我将能够通过检查命令是否在主机中完成来实现阻塞命令,如"walkTo",如果是,则去到下一个语句,否则,等到下一帧迭代.

有没有办法从带有LuaJ的Java主机(或任何其他Lua api)执行1个语句,或者我被迫使用lex和yacc开发自己的脚本引擎?

欢迎任何好主意,谢谢!

java lua luaj

5
推荐指数
1
解决办法
466
查看次数

Lua/Java/LuaJ - 处理或中断无限循环和线程

我正在使用LuaJ在Java中运行用户创建的Lua脚本.但是,运行永不返回的Lua脚本会导致Java线程冻结.这也使线程不可中断.我运行Lua脚本:

JsePlatform.standardGlobals().loadFile("badscript.lua").call();
Run Code Online (Sandbox Code Playgroud)

badscript.lua包含while true do end.

我希望能够自动终止陷入不屈服循环的脚本,并允许用户在运行时手动终止他们的Lua脚本.我已经阅读了有关debug.sethookpcall的内容,但我不确定我是如何正确地将它们用于我的目的.我也听说沙盒是一个更好的选择,虽然这有点超出我的范围.

这个问题也可能仅扩展到Java线程.我没有找到任何有关中断Java线程的确切信息while (true);.

在线Lua的演示非常有前途的,但似乎的检测和"坏"的脚本终止在CGI脚本,而不是Lua中完成.我是否可以使用Java来调用CGI脚本,该脚本又调用Lua脚本?不过,我不确定是否允许用户手动终止他们的脚本.我丢失了Lua演示源代码的链接,但我手头有它.这是神奇的路线:

tee -a $LOG | (ulimit -t 1 ; $LUA demo.lua 2>&1 | head -c 8k)
Run Code Online (Sandbox Code Playgroud)

有人能指出我正确的方向吗?

一些来源:

java lua multithreading interrupt luaj

4
推荐指数
1
解决办法
2355
查看次数

终止无响应的线程

我已经构建了一个java应用程序,并且在按下按钮时有一个在后台执行某些操作的线程.问题是,该线程可能会锁定,可能是由于无限循环.有没有办法可以强制终止该线程?

编辑:我在java平台上使用LuaJ.它具有锁定的潜力,除了在另一个线程中运行它并且在java或脚本完成时杀死它时,我实际上并没有太多的控制权.

java concurrency multithreading luaj

3
推荐指数
1
解决办法
1007
查看次数

Luaj os.time()返回毫秒

Luaj中的os.time()以毫秒为单位返回时间,但根据lua文档,它应该以秒为单位返回时间.

  1. 这是Luaj中的一个错误吗?
  2. 你能否建议一个适用于Luaj(适用于java)和真正Lua(c/c ++)的解决方法?因为我必须为两个应用程序使用相同的lua源.(不能简单地将它除以1000,因为它们都返回不同的时间尺度)

我的lua文件中的示例:

local start = os.time()
while(true) do
    print(os.time() - start)
end
Run Code Online (Sandbox Code Playgroud)

在c ++中,我收到了输出:

1
1
1
...(1 seconds passed)
2
2
2
Run Code Online (Sandbox Code Playgroud)

在java(使用Luaj)中,我得到了:

1
...(terminate in eclipse as fast as my finger can)
659
659
659
659
Run Code Online (Sandbox Code Playgroud)

我在Windows上尝试这个

time lua luaj

3
推荐指数
1
解决办法
4347
查看次数

在 LuaJ 中获取打印调用

我正在编写一个 Java 程序,它使用 Lua 脚本来确定要输出到程序的某些区域的内容。目前,我的代码如下所示:

Globals globals = JsePlatform.standardGlobals();
LuaValue chunk = globals.loadfile(dir.getAbsolutePath() + "/" + name);
chunk.call();
String output = chunk.tojstring();
Run Code Online (Sandbox Code Playgroud)

问题是调用似乎从 Lua 脚本tojstring()返回值。return这很好,但我需要接听print电话,因为这就是屏幕上显示的内容。截至目前,print调用直接发送到控制台(打印到控制台),并且我无法找到检索这些打印调用的方法。

我尝试过深入研究文档,但收效甚微。如果需要的话将从 LuaJ 进行更改。

java lua luaj

3
推荐指数
1
解决办法
763
查看次数

从LuaJ调用Lua函数

所以,我有一个类似的脚本:

function testfunction()
    print("Test from testfunction");
end
Run Code Online (Sandbox Code Playgroud)

我可以从Lua调用Java函数,但是如何完成相反的操作呢?如何使用LuaJ从Java调用Lua函数?

java lua luaj

2
推荐指数
1
解决办法
9177
查看次数

将java库函数加载到Luaj

我坚持加载java函数,以便可以使用luaj从lua文件中调用它.

我目前做的是创建这样的东西:

在some_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
}
Run Code Online (Sandbox Code Playgroud)

然后在lua文件中:

require "some_package/aif"
--etc ...
Run Code Online (Sandbox Code Playgroud)

然后在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) );         
}
Run Code Online (Sandbox Code Playgroud)

这段代码有效,但我想要的是在lua文件中我们不必使用"require".我已经类似地实现了这一点,但在c ++中使用这一行:

luaL_requiref(L, "aif", luaopen_aiflib, 1);
Run Code Online (Sandbox Code Playgroud)

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

globals.load(new …
Run Code Online (Sandbox Code Playgroud)

java lua luaj

2
推荐指数
1
解决办法
3883
查看次数

如何在 Lua/LuaJ 中使全局变量“不可变”?

描述

我正在做一个 LuaJ 程序,这是一个像这样的 lib 脚本:

function foo()
    print("foo");
end
Run Code Online (Sandbox Code Playgroud)

我希望该函数可以直接foo在其他脚本中调用(否),但在不同脚本中执行不可变。(即使一个脚本覆盖它,它也会像其他脚本中的原始方式一样执行。)require

例如,这是脚本 1:

foo = function()
    print("bar");
end
Run Code Online (Sandbox Code Playgroud)

这是脚本 2:

foo();
Run Code Online (Sandbox Code Playgroud)

做了什么

我看到了这两个问题。它们确实有效,但不是解决这个问题的方法。

LuaJ 如何避免覆盖全局表中的现有条目

防止 Lua 表中的函数重写

使全局环境仅可访问(Lua)


我尝试在每次 exec 脚本或 set 时加载 lib local _ENV,但由于可能会有从 Java 到 Lua 的进一步回调,因此它无法正常工作。

Globals我现在通过每次在 Java 中加载脚本时创建一个并加载 lib 脚本来处理它,如下所示:

    public static void main(String[] args) {
        loadAndCallViaDifferentEnv(libPath, script1);
        loadAndCallViaDifferentEnv(libPath, script2);
    }

    static void loadAndCallViaDifferentEnv(String libPath, String scriptPath) {
        Globals globals = JsePlatform.standardGlobals();
        globals.loadfile(libPath).call();
        globals.loadfile(scriptPath).call();
    }
Run Code Online (Sandbox Code Playgroud)

效果很好,但成本很高。有没有更好的办法?

lua luaj readonly-variable

1
推荐指数
1
解决办法
914
查看次数