LuaScriptCore
1.Android集成使用文档
2.https://gitee.com/Ghost233/LuaScriptCore(项目中使用到的实际LuaScriptCore源码)
集成方式
自动集成:
compile'com.github.vimfung.luascriptcore:luascriptcore:2.3.2'
使用说明:
使用一个YSLuaManager类统一管理。
初始化luaSciptCore
LuaScriptCore中提供了LuaContext这个上下文对象类来维护整个Lua的环境,所以使用LuaScriptCore的第一步就是对LuaContext进行初始化。如:
LuaContext context = LuaContext.create(this);
初始化完毕后才能进行下面的各种操作。
(其中,this是全局Context,最好传入的是Application,而不是Activity,避免内存泄露)
解析Lua脚本
原生层中要操作Lua中的变量或者方法,通常使用到的就是组织Lua脚本来进行一系列的Lua操作(LuaScriptCore屏蔽了Lua库中的C Api,目的是让代码更加接近原生,使用起来更加得心应手),然后交由Context进行脚本的解析。如:
context.evalScript("print('Hello World');");
Android原生代码调用Lua中的方法和变量,控制Lua的业务逻辑
//获取变量
LuaValue urlValue = context.getGlobal("url");
Log.d("LuaScriptCore", String.format("url = %s", urlValue.toString()));
//调用方法
context.callMethod("printUrl", new LuaValue[] {urlValue});
可以进一步封装,比如:
public <R extends JobResult, P extends JobParam> void executeJob(final Job<R, P> job, final ILuaCallBack<R> callBack) {
JobInfo info = job.getInfo();
mLuaContext.registerMethodOverride(info.back, new LuaMethodHandler() {
@Override
public LuaValue onExecute(LuaValue[] luaValues) {
mIsJobRunning = false;
if (luaValues != null && luaValues.length >= 1 && callBack != null) {
LuaValue value = luaValues[0];
String retString = value.toString();
final JobResult ret = job.parseResult(retString);
mUIHandler.post(new Runnable() {
@Override
public void run() {
callBack.luaDidCallBack((R) ret);
}
});
return new LuaValue(true);
}
return new LuaValue(false);
}
});
LuaValue jobName = new LuaValue(info.name);
LuaValue jobParam = new LuaValue(job.getParamJson());
LuaValue jobBack = new LuaValue(info.back);
mLuaContext.callMethod(excuteJobMethod, new LuaValue[]{jobName, jobParam, jobBack});
}