安装与环境配置

       本节将详细介绍如何在Android平台上配置Lua开发环境,包含LuaJava和Androlua两种方案的完整安装指南。

1. LuaJava环境配置

       LuaJava是Android官方推荐的Lua绑定方案,提供完整的Java-Lua互操作能力。

1.1 Gradle依赖配置

// 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
    }
}

1.2 初始化Lua虚拟机

// 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();
    }
}

2. Androlua环境配置

       Androlua是专为Android优化的Lua开发框架,提供更简洁的API和UI组件。

2.1 项目集成

// build.gradle (Project)
allprojects {
    repositories {
        maven { url 'https://jitpack.io' }
    }
}

// build.gradle (Module)
dependencies {
    implementation 'com.github.androlua:androlua:v5.0.3'
}

2.2 基础用法

-- 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
            }
        }
    }
)

3. 混合开发配置

       结合LuaJava和Androlua的优势,实现更灵活的混合开发模式。

3.1 项目结构

src/
├── main/
│   ├── assets/
│   │   └── lua_scripts/
│   │       ├── main.lua
│   │       └── libs/
│   └── java/
│       └── com/example/luahybrid/
│           ├── LuaEngine.java
│           └── MainActivity.java

3.2 核心桥接代码

// 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();
        }
    }
}

4. 调试与测试

       Android平台Lua代码的调试方法和性能测试技巧。

4.1 日志输出

-- 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;
    }
});

4.2 性能优化

-- 避免频繁创建临时表
local tbl = {}
for i = 1, 1000 do
    -- 不好:每次循环创建新表
    -- process({key = i})
    
    -- 好:复用表对象
    tbl.key = i
    process(tbl)
end

-- 预加载常用模块
local string = require "string"
local table = require "table"

常见问题解决方案