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

我发现在Android上使用LuaJ的一种方法! 🙂

关键是直接使用LuaJ API,而不是通过javax.script.这是有点棘手的,因为没有教程,所以这里是一个前后,所以其他人不必通过选择通过LuaJ源代码和JavaDoc.我真的希望这有助于某人开车给我笨蛋!

注意:“秘密游戏”不是我游戏的实际名称;-)

后:

package secretgame.scripting;

import java.io.ByteArrayInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.util.ArrayList;

import org.luaj.vm2.LuaClosure;

import org.luaj.vm2.LuaTable;

import org.luaj.vm2.LuaValue;

import org.luaj.vm2.Prototype;

import org.luaj.vm2.compiler.LuaC;

import org.luaj.vm2.lib.jse.CoerceJavaToLua;

import org.luaj.vm2.lib.jse.JsePlatform;

import secretgame.SecretGameException;

import secretgame.events.EventArgs;

import secretgame.levels.Level;

public class DirectLuaj implements Lua

{

private final Level level;

private final ScriptTools scriptTools;

private final ScriptEvents scriptEvents;

private int nextId = 0;

private ArrayList scripts = new ArrayList();

public DirectLuaj(Level level, ScriptTools scriptTools,

ScriptEvents scriptEvents)

{

this.level = level;

this.scriptTools = scriptTools;

this.scriptEvents = scriptEvents;

}

@Override

public int add(String scriptText) throws SecretGameException

{

try {

InputStream input = new ByteArrayInputStream(scriptText.getBytes());

Prototype p = LuaC.compile(input, "script");

LuaValue g = JsePlatform.standardGlobals();

LuaClosure c = new LuaClosure(p, g);

scripts.add(c);

}

catch (IOException e) {

throw new SecretGameException("compile failed", e);

}

return nextId++;

}

@Override

public void run(int id, EventArgs args) throws SecretGameException

{

LuaClosure script = scripts.get(id);

LuaTable bindings = new LuaTable();

bindings.set("java", toLua(scriptTools));

bindings.set("level", toLua(level));

bindings.set("args", toLua(args));

bindings.set("events", toLua(scriptEvents));

script.setfenv(bindings);

script.call();

}

private LuaValue toLua(Object javaValue) {

return javaValue == null? LuaValue.NIL:

javaValue instanceof LuaValue? (LuaValue) javaValue:

CoerceJavaToLua.coerce(javaValue);

}

}

之前:

package secretgame.scripting;

import java.util.ArrayList;

import javax.script.Bindings;

import javax.script.Compilable;

import javax.script.CompiledScript;

import javax.script.ScriptEngine;

import javax.script.ScriptEngineManager;

import javax.script.ScriptException;

import secretgame.SecretGameException;

import secretgame.events.EventArgs;

import secretgame.levels.Level;

// sadly this won't work on Android because there's no such thing

// as javax.script in Dalvik ... dumb Android java :|

public class JavaxScriptingLua implements Lua

{

private ScriptEngine scriptEngine;

private final Level level;

private final ScriptTools scriptTools;

private final ScriptEvents scriptEvents;

private int nextId = 0;

private ArrayList scripts = new ArrayList();

public JavaxScriptingLua(Level level, ScriptTools scriptTools, ScriptEvents scriptEvents)

{

this.level = level;

this.scriptTools = scriptTools;

this.scriptEvents = scriptEvents;

ScriptEngineManager sem = new ScriptEngineManager();

scriptEngine = sem.getEngineByExtension(".lua");

}

public int add(String scriptText) throws SecretGameException

{

try {

CompiledScript script = ((Compilable)scriptEngine).compile(scriptText);

scripts.add(script);

}

catch (ScriptException e) {

throw new SecretGameException("could not compile lua.", e);

}

return nextId++;

}

public void run(int id, EventArgs args) throws SecretGameException

{

Bindings bindings = scriptEngine.createBindings();

bindings.put("java", scriptTools);

bindings.put("level", level);

bindings.put("args", args);

bindings.put("events", scriptEvents);

try {

scripts.get(id).eval(bindings);

}

catch (ScriptException e) {

throw new SecretGameException("could not run script.", e);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值