package com.mozz.htmlnative.script.lua; import android.os.SystemClock; import android.util.Log; import com.mozz.htmlnative.HNLog; import com.mozz.htmlnative.HNSandBoxContext; import com.mozz.htmlnative.script.ScriptRunner; import org.luaj.vm2.Globals; import org.luaj.vm2.LuaValue; import org.luaj.vm2.lib.jse.JsePlatform; import static com.mozz.htmlnative.HNEnvironment.PERFORMANCE_TAG; /** * @author Yang Tao, 17/3/21. */ public class LuaRunner extends ScriptRunner { private Globals mGlobals; private static final String TAG = LuaRunner.class.getSimpleName(); public LuaRunner(HNSandBoxContext sandBoxContext) { super(sandBoxContext); long time1 = SystemClock.currentThreadTimeMillis(); mGlobals = JsePlatform.standardGlobals(); // register global variables register(new LDocument(sandBoxContext)); register(LConsole.getInstance()); // register api register(new LToast(sandBoxContext.getAndroidContext())); register(new LFindViewById(sandBoxContext)); Log.i(PERFORMANCE_TAG, "init Lua module spend " + (SystemClock.currentThreadTimeMillis() - time1) + "" + " ms"); } @Override public void run(String script) { HNLog.d(HNLog.SANDBOX, "Execute script \"" + script + "\"."); try { LuaValue l = mGlobals.load(script); l.call(); } catch (final Exception e) { // make sure that lua script dose not crash the whole app e.printStackTrace(); Log.e(TAG, "LuaScriptRun"); dispatchScriptError(e); } } @Override public void runFunction(String functionName) { LuaValue v = mGlobals.get(functionName); if (v != null) { try { v.call(); } catch (Exception e) { e.printStackTrace(); Log.e(TAG, "LuaScriptRun"); dispatchScriptError(e); } } } public void runFunction(String functionName, LuaFuncParams params) { LuaValue v = mGlobals.get(functionName); if (v != null) { try { v.call(params.mValue); } catch (Exception e) { e.printStackTrace(); Log.e(TAG, "LuaScriptRun"); dispatchScriptError(e); } } } protected final void register(ILApi api) { if (api instanceof LuaValue) { mGlobals.set(api.apiName(), (LuaValue) api); } } protected final void register(ILGlobalObject api) { if (api instanceof LuaValue) { mGlobals.set(api.objectName(), (LuaValue) api); } } }