没有合适的资源?快使用搜索试试~ 我知道了~
随着移动设备的兴起,Lua作为嵌入式脚本语言,由于其自身的特点及优势,在应用领域使用度越来越高。本文从 Lua最基础的嵌入式功能讲起,然后再到安卓、IOS平台的配置及使用。详细说明了Lua嵌入到各个环境中的基本原理及要点,旨在让读者可以避开语法等细节问题,直接对 Lua的嵌入应用实践有一个清晰的理解,能够更快地进入脚本嵌入的开发实战。现如今,移动应用程序被应用的越来越宽泛,程序越来越复杂,跨平台开发也显得越来越重要。
资源推荐
资源详情
资源评论
Lua在移动平台上的应用在移动平台上的应用
Lua 嵌入实践
随着移动设备的兴起,Lua 作为嵌入式脚本语言,由于其自身的特点及优势,在应用领域使用度越来越高。本文从 Lua 最基
础的嵌入式功能讲起,然后再到安卓、IOS 平台的配置及使用。详细说明了 Lua 嵌入到各个环境中的基本原理及要点,旨在
让读者可以避开语法等细节问题,直接对 Lua 的嵌入应用实践有一个清晰的理解,能够更快地进入脚本嵌入的开发实战。
现如今,移动应用程序被应用的越来越宽泛,程序越来越复杂,跨平台开发也显得越来越重要。针对各自的平台做原生开发无
疑是重复制造轮子,那么有没有什么可以让已造好的轮子进行复用呢?
Lua 就此提供了这个可行性,并且,基于寄存器设计的 Lua 执行效率是非常好的,几乎不需要考虑 Lua 执行的代价。但 Lua
并非像 Python 那样成为可以自立门户的脚本语言,它必须借助于 C 库才能发挥出它强大的功能。也许您会说,既然要借助于
C 库,干嘛不直接用 C 呢,何必再多借助一层?Lua 的代码是按照“Clean ANSI C”的标准编写且是解释执行的脚本,那么它
就可以在任何支持 C 的环境中运行,同时意味着,你可以随时更新它,完全绕开先编译再运行,甚至可能重启应用或服务的
过程。
在本篇文章中,我们抛开语法等大部头的东西,直接讲解最关键部分,Lua 在各种平台中是如何进行嵌入及配置。只有先解决
并弄清楚这些关键问题,那么 Lua 的应用才不会再让我们感到那么棘手,基于 Lua 开发的其他应用扩展就会势如破竹一气呵
成。最后我们也就会感慨一句,Lua 原来并不复杂,只需要做这点事而已。
本篇分两部分,第一部分讲嵌入实战,第二部分讲 Lua 的相关配置。
嵌入实战
我们先从最基础的 C 嵌入讲起,直到嵌入到移动应用,由简入繁,让我们逐步弄清移动应用嵌入 Lua 的原理。其中最重要的
一点是:Lua 实际上是通过堆栈的共享来与 C 进行数据交互 (除了通常意义的数据类型外,函数、文件等也被当作是一种数
据)。
本文示例所使用的 Lua 版本是现在用得比较广泛的 Lua 5.1.1 版本。
纯 C 环境下嵌入 Lua
Lua 是“生存”于 C 环境中的,因此,用 Lua,首先得有 C 环境。这个是 Lua 嵌入的根本,所以会花较多的篇幅详述,如果弄
清楚了这个,就迈出了 Lua 嵌入第一步也是最重要的一步。
C 应用中调用 Lua 脚本
第 1 个例子,我们使用最简洁的代码完成这个最基本的功能。
创建 helloWorld.lua 文件:
print("Hello World!")
创建 helloWorld.c 文件:
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
int main()
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
luaL_dofile(L, "helloWorld.lua");
lua_close(L);
return 0;
}
Lua 脚本 helloWorld.lua 仅做最基本的字符打印。
C 文件代码则明显复杂点,借助于 Lua 帮助文档,我们可以很快理解在 C 中使用 Lua 每一行代码的作用,这里以 main 函数
体内代码逐行解释:
L1:使用 luaL_newstate 函数创建 Lua 与 C 进行数据交互的堆栈并返回指针 L;
L2:使用 luaL_openlibs 函数为堆栈加载所有的标准 Lua 库,支持脚本在 C 应用中执行;
L3:使用 luaL_dofile 函数执行整个 Lua 脚本文件 helloWorld.lua
L4:使用 lua_close 函数关闭堆栈,释放资源
关于运行脚本,在此不做赘述。笔者是使用 gcc 命令编译执行,可运行在 Mac、Linux、Unix 环境。
运行命令,显示 Hello World!:
gcc helloWorld.c -o helloWorld.out -I/usr/local/include -L/usr/local/lib –llua &./helloWorld.out
从这个最基本的函数可以看出:Lua 与 C 的交互是基于堆栈进行的,创建出堆栈后,C 和 Lua 就共同使用这个堆栈的特性进
行数据交互以及各种操作。下面的例子可以更清楚的说明:
C 应用进行 C 与 Lua 的交互 (Lua 调用 C 函数)
修改 helloWorld.lua 文件:
print(sayHelloWorld("Hello World!"))
修改 helloWorld.c 文件:
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
int sayHelloWorld(lua_State *L)
{
const char * str = lua_tostring(L, 1);
lua_pushstring(L, str);
return 1;
}
int main()
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
lua_register(L, "sayHelloWorld", sayHelloWorld);
luaL_dofile(L, "helloWorld.lua");
lua_close(L);
return 0;
}
在终端运行后,显示和上例一样,但其中过程复杂了些。
Lua 脚本不再单纯地打印字符,而是打印出调用 C 文件中函数 sayHelloWorld 的返回值。可以看出 Lua 是直接使用 C 函数
的,但这好像又不是那么简单的。因为通常的 C 函数,Lua 肯定不能直接调用,因此对于 C 来说,如何创建用于 Lua 的函
数,或者说 Lua 怎么知道这个函数可以调用,这个是需要我们了解清楚的。这个例子用最核心的精简代码实现:
1. 我们先从 Lua 与 C 的桥接函数 int sayHelloWorld(lua_State *L) 看起:参数使用的是 lua_State 类型的指针,返回的是整型
数字。这里读取参数,返回参数和通常的函数有点不同:参数为指向数据共享堆栈的指针,而实际传入的参数都放在这个指向
的堆栈中,函数通过这个堆栈获得实际的传入参数;整型返回值并非通常意义的返回值,这个数字是用来通知 Lua 脚本这个
函数返回值的个数,真正的返回值是压在堆栈中,因此,对于 Lua 及 Lua 桥接函数来说,传入参数及返回值都是放在指针 L
指向的堆栈中,同时,这样的处理,就支持了可以传入的多个参数也可以返回多个值。该函数内代码,使用针对堆栈对应的获
得传入参数及写入返回值的函数完成功能。本例使用 Lua 取数据的方法之一 lua_tostring 从堆栈中取得第一个类型为字符串的
数据;使用 Lua 压入数据方法之一 lua_pushstring 将字符串类型的返回值压入到堆栈中 (Lua 有其对应的类型从堆栈上取数
据、数据的方法,具体情况请参考 Lua 手册)。同时将返回值的个数 return 给 Lua 脚本,本例压入堆栈的返回值只有一个,
因此返回 1。由此看出:与 Lua 打交道的函数是特供的,需要此函数来桥接 C 与 Lua,其基本的规则就如上所述,通过它,
将 Lua 与 C 结合在一起。
2. 接着看 main 函数。相比前一例增加了一行 lua_register 调用函数,通过这个函数用来注册桥接函数。因为在调用
luaL_openlibs 函数加载 Lua 函数库到堆栈中,此时堆栈中是没有我们自定义函数 sayHelloWorld 的任何信息的,此时直接执
行 Lua 脚本,肯定会报找不到函数而错误。要让 Lua 可以调用此函数,必须得让 Lua 脚本“知道”有这样一个函数的存在,所
以 main 函数中使用代码 lua_register(L, "sayHelloWorld", sayHelloWorld) 将桥接函数 sayHelloWorld 注册进堆栈中的,让
Lua 可以通过堆栈调用 C 中的该函数,完成交互。
通过本例我们可以了解到:Lua 要使用自定义的 C 函数,需要书写特定规则的桥接函数,接着将桥接函数注册进堆栈中,这
样 Lua 脚本就能通过调用这个桥接函数完成 Lua 与 C 的数据交互。
运行命令,显示 Hello World!:
gcc helloWorld.c -o helloWorld.out -I/usr/local/include -L/usr/local/lib –llua &./helloWorld.out
这个例子说明了 Lua 调用 C 函数的的情况,那 C 调用 Lua 的数据又是怎样的呢?
C 应用进行 C 与 Lua 的交互 (C 调用 Lua 数据)
修改 helloWorld.lua 文件:
剩余8页未读,继续阅读
资源评论
weixin_38673694
- 粉丝: 3
- 资源: 949
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C#ASP.NET拍客相片展示平台源码数据库 SQL2008源码类型 WebForm
- 短期气候Python绘图-中国夏季降水分布以及环流异常分析
- Vue 3 的简单日期选择器组件.zip
- MVVMHabit-master(2024).7z
- EasyPay-master(2024).7z
- C#MVC5+Easyui学生宿舍故障报修系统源码数据库 SQL2008源码类型 WebForm
- Vue 3 和 Firebase Udemy 课程的所有课程文件 .zip
- vue 2.x vue 3.x 日历组件.zip
- 11-网络管理和监控配置指导-NETCONF配置(2024).7z
- 网络的组建步骤(基础)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功