当前位置: 首页 > news >正文

鸿蒙平台运行Lua脚本

1. 目标

使用 rust 在移动端实现 Lua 脚本的运行。

2. 核心步骤

[Rust Host App]│├── [mLua VM] (通过 `mlua` 或 `rlua` 库嵌入)│   ├── 独立Lua状态(隔离执行)│   ├── 受限标准库(禁用危险函数)│   └── 内存/CPU限制│└── [Rust ↔ Lua 互操作]├── 导出Rust函数/结构体到Lua└── 从Lua回调Rust

1. Android 和 iOS

  • mlua 对 这两端的实配较为成熟,rust 可自动识别交叉编译工具链

  • 只需在 features 中打开 vendored 配置即可

# Cargo.toml
[dependencies]
mlua = {version = "0.10.5", features = ["lua54", "vendored"]}

2. Harmony

  • 下载 Lua 源代码,本次使用的版本是 5.4.7

  • 修改 Makefile 文件,一共两个

// Makefile
INSTALL_TOP?= /usr/local// src/Makefile
CC?= gcc -std=gnu99
RANLIB?= ranlib
  • 执行 make 进行编译

    export INSTALL_TOP="$(pwd)/$OUTPUT_DIR"
    export CC="$TOOLCHAIN/bin/aarch64-unknown-linux-ohos-clang"
    export RANLIB="$TOOLCHAIN/bin/llvm-ranlib"make clean
    make generic -j8
    make install
    • 经过上述步骤会生成鸿蒙平台的 .a 库

    3. 配置rust工程

    • 引入 mlua,和安卓、iOS 不同,这里 features 要选择 module

    mlua = { version = "0.10.5", features = ["lua54", "module"] }
    • 把 .a 文件 copy 到 libs 目录下,并编辑 build.rs

      "aarch64-unknown-linux-ohos" => {println!("cargo:rustc-link-search=native=./libs/ohos/arm64-v8a");println!("cargo:rustc-link-lib=static=lua");napi_build_ohos::setup();
      }
    • 编写 napi 方法

      #[napi]
      fn napi_pi(path: String) -> i64 {init_logger();hook_panic(Some(Box::new(PanicListener)));calculate_pi(path) as i64
      }fn calculate_pi(path:String) -> u128 {let start = Instant::now();let script = std::fs::read_to_string(path + "/lua_scripts/pi.lua").expect("Failed to read pi.lua");let lua = Lua::new();// 加载Lua脚本lua.load(&script).exec().expect("Failed to load pi.lua");let test_pi: mlua::Function = lua.globals().get("testPi").expect("Failed to get testPi");let result:bool = test_pi.call((100)).expect("Failed to call pi.lua");start.elapsed().as_millis()
      }

      4. 配置鸿蒙工程

      • 把 lua 脚本 copy 到 raw 文件夹中,然后 copy 到沙盒目录

      async copyRawFiles(node: string) {const resManager = getContext().resourceManager;const baseDir = `${getContext().getApplicationContext().filesDir}`;const queue = new Queue<string>();queue.add(node);while (queue.length > 0) {const currentNode = queue.pop();try {const bytes = resManager.getRawFileContentSync(currentNode);hilog.info(DOMAIN, 'testTag', `${bytes.length}`);const targetPath = `${baseDir}/${currentNode}`const fileStream = fs.createStreamSync(targetPath, "w+");fileStream.writeSync(bytes.buffer);fileStream.close();} catch (e) {hilog.info(DOMAIN, 'testTag', `${JSON.stringify(e)}`);const targetPath = `${baseDir}/${currentNode}`if (!fs.accessSync(targetPath)) {fs.mkdirSync(targetPath);}const fileList = resManager.getRawFileListSync(currentNode);fileList.forEach((it) => queue.add(`${currentNode}/${it}`));}}
      }
      • 调用 rust napi 方法

        import rust from 'liblogic_device_test.so';async executeLuaPi() {const baseDir = `${getContext().getApplicationContext().filesDir}`;let total = 0;for (let i = 0; i < 100; i++) {const time: number = rust.napiPi(`${baseDir}/lua`);total += time;}hilog.info(DOMAIN, 'testTag', `${total}`);
        }

      3. 团队介绍

      三翼鸟数字化技术平台-智家APP平台」通过持续迭代演进移动端一站式接入平台为三翼鸟APP、智家APP等多个APP提供基础运行框架、系统通用能力API、日志、网络访问、页面路由、动态化框架、UI组件库等移动端开发通用基础设施;通过Z·ONE平台为三翼鸟子领域提供项目管理和技术实践支撑能力,完成从代码托管、CI/CD系统、业务发布、线上实时监控等Devops与工程效能基础设施搭建。
       

      http://www.lryc.cn/news/598102.html

      相关文章:

    • 自己动手造轮子:如何创建JAR并通过Maven在Spring Boot中引用
    • Python进阶第三方库之Matplotlib
    • 同花顺前端潜在面试题目与答案
    • [iOS开发工具] 【iOS14以及以下】cydia商店按键精灵iOS新版V2.X安装教程
    • 数据库垂直拆分和水平拆分
    • Kafka入门指南:从零开始掌握分布式消息队列
    • 【医疗行业】DICOM
    • Spring Boot 请求参数绑定:全面解析常用注解及最佳实践
    • PHP文件下载
    • Edwards爱德华泵软件 支持nEXT85和nXDS系列泵,包括nXRi, nRVi和nXLi增强型 nEXT nXDS nXLi
    • 二分查找----4.搜索旋转排序数组
    • 【STM32】FreeRTOS 任务的删除(三)
    • 力扣面试150题--在排序数组中查找元素的第一个和最后一个位置
    • C++ - 仿 RabbitMQ 实现消息队列--服务端核心模块实现(三)
    • MapStruct类型转换接口未自动注入到spring容器中
    • 点击按钮滚动到底功能vue的v-on:scroll运用
    • 大模型微调学习笔记(基于讯飞星辰MaaS速学版)
    • Hive常用函数
    • CSDN技术专栏开篇:高效开发环境搭建指南
    • 重构数据库未来:金仓数据库,抢占 AI 原生时代先机
    • 基础NLP | 01 机器学习 深度学习基础介绍
    • uni-appDay02
    • uniapp中flex布局gap属性兼容处理
    • LockPatternUtils中比较重要的方法
    • day46.通道注意力
    • 【SpringAI实战】FunctionCalling实现企业级自定义智能客服
    • Quarkus利用 MicroProfile 实现微服务特性
    • 基于深度学习的图像分类:使用EfficientNet实现高效分类
    • 期货交易系统:市场生态中的功能映射与价值逻辑
    • uni-app小程序云效持续集成