如何在Java应用程序中运行Lua脚本在Android上?

我正在使用Java开发一个在Android平台上使用Lua脚本的游戏。为了运行这些脚本,我正在使用Java的ScriptEngine类来使用LuaJ。例如:

ScriptEngineManager sem = new ScriptEngineManager();
scriptEngine = sem.getEngineByExtension(".lua");
script = ((Compilable)scriptEngine).compile("some lua here");

然而,显然在Android上不受支持(据我所知,与Android没有拥有完整的JVM有关)。是否有一种方法可以在Android上使用Lua脚本?也许有一个LuaJ的替代品?也许有一种直接使用LuaJ编译和执行Lua脚本的方法(尽管我不知道如何实现)。

FYI,当我在Android上运行这段代码时,我看到了这个错误:

05-06 16:12:32.870: E/dalvikvm(17509): Could not find class 'javax.script.ScriptEngineManager', referenced from method unearth.levels.LevelReader.<init>
05-06 16:12:32.870: W/dalvikvm(17509): VFY: unable to resolve new-instance 787 (Ljavax/script/ScriptEngineManager;) in Lunearth/levels/LevelReader;
05-06 16:12:32.870: D/dalvikvm(17509): VFY: replacing opcode 0x22 at 0x0018
05-06 16:12:32.875: E/dalvikvm(17509): Could not find class 'javax.script.Compilable', referenced from method unearth.levels.LevelReader.parseScript
05-06 16:12:32.875: W/dalvikvm(17509): VFY: unable to resolve check-cast 782 (Ljavax/script/Compilable;) in Lunearth/levels/LevelReader;
05-06 16:12:32.875: D/dalvikvm(17509): VFY: replacing opcode 0x1f at 0x0047
05-06 16:12:32.875: W/dalvikvm(17509): VFY: unable to resolve exception class 788 (Ljavax/script/ScriptException;)
05-06 16:12:32.875: W/dalvikvm(17509): VFY: unable to find exception handler at addr 0x51
05-06 16:12:32.875: W/dalvikvm(17509): VFY:  rejected Lunearth/levels/LevelReader;.parseScript (Lorg/w3c/dom/Element;Lunearth/levels/Level;)V
05-06 16:12:32.875: W/dalvikvm(17509): VFY:  rejecting opcode 0x0d at 0x0051
05-06 16:12:32.875: W/dalvikvm(17509): VFY:  rejected Lunearth/levels/LevelReader;.parseScript (Lorg/w3c/dom/Element;Lunearth/levels/Level;)V
05-06 16:12:32.875: W/dalvikvm(17509): Verifier rejected class Lunearth/levels/LevelReader;
05-06 16:12:32.890: W/dalvikvm(17509): threadid=11: thread exiting with uncaught exception (group=0x40c331f8)
05-06 16:12:32.895: E/AndroidRuntime(17509): FATAL EXCEPTION: GLThread 1062
05-06 16:12:32.895: E/AndroidRuntime(17509): java.lang.VerifyError: unearth/levels/LevelReader
05-06 16:12:32.895: E/AndroidRuntime(17509):    at unearth.Game.startGame(Game.java:201)
05-06 16:12:32.895: E/AndroidRuntime(17509):    at unearth.Game.update(Game.java:713)
05-06 16:12:32.895: E/AndroidRuntime(17509):    at unearth.screens.LoadScreen.update(LoadScreen.java:56)
05-06 16:12:32.895: E/AndroidRuntime(17509):    at unearth.UnearthListener.render(UnearthListener.java:71)
05-06 16:12:32.895: E/AndroidRuntime(17509):    at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:423)
05-06 16:12:32.895: E/AndroidRuntime(17509):    at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1462)
05-06 16:12:32.895: E/AndroidRuntime(17509):    at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1216)
05-06 16:12:58.600: D/dalvikvm(17509): GC_CONCURRENT freed 334K, 3% free 16196K/16647K, paused 2ms+6ms

更新:

也许这个项目有一些有用的代码?http://code.google.com/p/android-scripting/

原文链接 https://stackoverflow.com/questions/10471667

点赞
stackoverflow用户115145
stackoverflow用户115145

不过,显然安卓系统不支持此项功能。

正确。

我在某个地方读到过这与安卓没有完整的 JVM 有关。

正确。如果您查看[JavaDocs](http://developer.android.com/reference/packages.html),您会发现`javax.script`不存在于安卓 SDK 中。

也许我会尝试这个:https://github.com/damonkohler/sl4a

那是一个选项。另一个选项是通过 NDK 将 Lua 解释器嵌入您的应用程序,就像这个[示例应用程序](https://github.com/commonsguy/cw-andtuning/tree/master/NDK/LuaInterpreter)中所示。

2012-05-06 15:25:11
stackoverflow用户221509
stackoverflow用户221509

注意: 除了使用 LuaJ,也可以使用与使用 NDK 编译的 Android Lua 一起使用的 LuaJava。这使得 Lua 完全可以访问 Java 提供的任何内容。请查看此示例以了解如何入门。

如果您不想操作 NDK,可以在 libs 目录中提供编译的 Lua 5.1.4 和 LuaJava(一个 libluajava.so 文件)。但是,设置起来也相对容易。

2012-05-06 22:30:56
stackoverflow用户382871
stackoverflow用户382871

想在 Android 上使用 Lua,可以使用 JNLua + Lua 5.2(使用 C 实现)。唯一支持 JSR 223(javax.script)的 Android 端口在这里:https://github.com/danke-sra/jnlua-android

使用此端口,您可以实现您想要的内容:

ScriptEngine scriptEngine = new LuaScriptEngineFactory().getEngine();
scriptEngine.eval("lua statements");
2016-01-20 06:02:45