在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)
我该怎么做呢?
我正在尝试使用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) 我已将我的libgdx(1.3),maven,robovm项目从0.0.13迁移到0.0.14,以支持IOS 8设备.我根据发行说明修改了我的robovm.xml文件,可以在IOS 8设备上运行但在几个地方获得NullPointerException.我遇到的问题如下:
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)
我认为有些内容与0.0.14版本的反射行为有关,因为就我看来,异常与反射有关.顺便说一句,IOS 7.1设备上存在相同的NullPointerException问题,但"声音,音乐,振动"正在发挥作用.
我该如何解决这个NullPointerException问题?
感谢和问候
我正在尝试使用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:尝试索引?(函数值)
谢谢你的帮助!
我正在做一些奇怪的事情,导致这个错误.
以下简单示例失败:
--> 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的脚本系统嵌入到我的游戏引擎中.我希望脚本能够同时具有阻塞和非阻塞命令,例如:
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开发自己的脚本引擎?
欢迎任何好主意,谢谢!
我正在使用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.sethook和pcall的内容,但我不确定我是如何正确地将它们用于我的目的.我也听说沙盒是一个更好的选择,虽然这有点超出我的范围.
这个问题也可能仅扩展到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应用程序,并且在按下按钮时有一个在后台执行某些操作的线程.问题是,该线程可能会锁定,可能是由于无限循环.有没有办法可以强制终止该线程?
编辑:我在java平台上使用LuaJ.它具有锁定的潜力,除了在另一个线程中运行它并且在java或脚本完成时杀死它时,我实际上并没有太多的控制权.
Luaj中的os.time()以毫秒为单位返回时间,但根据lua文档,它应该以秒为单位返回时间.
我的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上尝试这个
我正在编写一个 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 进行更改。
所以,我有一个类似的脚本:
function testfunction()
print("Test from testfunction");
end
Run Code Online (Sandbox Code Playgroud)
我可以从Lua调用Java函数,但是如何完成相反的操作呢?如何使用LuaJ从Java调用Lua函数?
我坚持加载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) 描述
我正在做一个 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)
做了什么
我看到了这两个问题。它们确实有效,但不是解决这个问题的方法。
我尝试在每次 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)
效果很好,但成本很高。有没有更好的办法?