本节将详细介绍如何在Android平台上配置Lua开发环境,包含LuaJava和Androlua两种方案的完整安装指南。
LuaJava是Android官方推荐的Lua绑定方案,提供完整的Java-Lua互操作能力。
// build.gradle (Module)
dependencies {
implementation 'org.luaj:luaj-jse:3.0.1'
implementation 'com.android.tools.build:gradle:7.2.1'
}
// 启用Java8特性
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
// MainActivity.java
import org.luaj.vm2.Globals;
import org.luaj.vm2.lib.jse.JsePlatform;
public class MainActivity extends AppCompatActivity {
private Globals lua;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 初始化Lua环境
lua = JsePlatform.standardGlobals();
// 执行Lua脚本
lua.load("print('Hello from LuaJava')").call();
}
}
Androlua是专为Android优化的Lua开发框架,提供更简洁的API和UI组件。
// build.gradle (Project)
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
// build.gradle (Module)
dependencies {
implementation 'com.github.androlua:androlua:v5.0.3'
}
-- main.lua
require "import"
import "android.widget.*"
-- 创建Activity
activity.setContentView(
LinearLayout(activity).setup{
orientation = "vertical",
{
TextView(activity).setup{
text = "Hello Androlua",
textSize = "20sp"
},
Button(activity).setup{
text = "点击",
onClick = function()
Toast.makeText(activity, "按钮点击", Toast.LENGTH_SHORT).show()
end
}
}
}
)
结合LuaJava和Androlua的优势,实现更灵活的混合开发模式。
src/
├── main/
│ ├── assets/
│ │ └── lua_scripts/
│ │ ├── main.lua
│ │ └── libs/
│ └── java/
│ └── com/example/luahybrid/
│ ├── LuaEngine.java
│ └── MainActivity.java
// LuaEngine.java
public class LuaEngine {
private static Globals lua;
public static void init(Context ctx) {
lua = JsePlatform.standardGlobals();
// 暴露Java方法到Lua
lua.set("androidToast", new BaseFunction() {
@Override
public LuaValue call(LuaValue modname, LuaValue env) {
String text = env.checkjstring(1);
Toast.makeText(ctx, text, Toast.LENGTH_SHORT).show();
return NIL;
}
});
}
public static void runScript(String assetPath) {
try {
InputStream is = ctx.getAssets().open(assetPath);
lua.load(is, "script", "bt", lua).call();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Android平台Lua代码的调试方法和性能测试技巧。
-- Lua端日志输出
local function debug(...)
local info = debug.getinfo(2, "Sl")
local msg = string.format("[%s:%d] %s",
info.short_src, info.currentline,
table.concat({...}, "\t"))
androidLog(msg) -- 调用Java桥接方法
end
-- Java端实现
lua.set("androidLog", new BaseFunction() {
@Override
public LuaValue call(LuaValue modname, LuaValue env) {
Log.d("LUA_DEBUG", env.checkjstring(1));
return NIL;
}
});
-- 避免频繁创建临时表
local tbl = {}
for i = 1, 1000 do
-- 不好:每次循环创建新表
-- process({key = i})
-- 好:复用表对象
tbl.key = i
process(tbl)
end
-- 预加载常用模块
local string = require "string"
local table = require "table"