Lua与C在Android上的互调

本文介绍了如何在Android应用中嵌入Lua运行环境,通过Lua与C的互调实现热更新功能。讲解了Lua的C API、lua_State上下文、Lua栈以及如何调用Lua函数和C函数。详细阐述了Lua栈操作、类型检查、值的获取,以及如何加载和执行Lua脚本。提供了示例代码和Demo下载链接,帮助开发者实现Lua在Android上的应用。
摘要由CSDN通过智能技术生成

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wuyoujian0313/article/details/134662953
————————————————

在本文中,我们将重点探讨如何将Lua运行环境(Lua虚拟机)嵌入到android应用程序中,并实现Lua与C互调,实现android app的热更新能力。本文涉及技术点,在demo中均实现,下载地址在此文后面,欢迎下载学习使用。

Lua的C API

源码中,我们主要关注下面几个头文件即可:
Lua库public头文件

  1. lua.h:Lua绝大部分API都此文件中定义,所有API都以lua_为前缀
  2. luaxlib.h:对lua.h中公开的公共API做更高层次的抽象,所有函数都以luaL_为前缀
  3. lualib.h:类似luaxlibi.h,所有函数也都以luaL_为前缀
  4. luaconfig.h : 配置定义,一般控制多平台支持的配置设置
  5. lua.hpp: 对外的公共头文件,一般引入此头文件即可

Lua的上下文lua_State

Lua底层是采用C语言开发,一般C或者C++开发的底层,都会提供一个类似上下文一样的东西: lua_State。它将所有的状态存储在一个叫做lua_State的结构中。包含了Lua运行时所需的一切。Lua底层会对lua_State实例使用互斥锁,确保Lua实例都是线程安全的。在一个应用程序中创建可以多个lua_State实例,但我们不建议这么做。

调用luaL_newstate创建一个lua_State实例,它将返回一个lua_State结构的指针,此指针在其他的任何Lua API 中都需要传递(本质上就是Lua虚拟机要知道自己在处理哪个上下文)。在程序结束或者不需要Lua时候,请调用lua_close(lua_State*) 销毁此上下文实例。

创建上下文之后,还需要进一步把Lua标准库加载进来,它才会有相应的Lua运行能力,一个标准的调用模式如下:

#include "lua.hpp"

int main(int argc, char** argv) {
   
    // 创建lua state
    lua_State *L = luaL_newstate();
    // 加载所有的标准库
    luaL_openlibs(L);
    
    //操作Lua的代码
    
    // 销毁lua state
    lua_close(L);
    return 0;
}

Lua栈

在实现Lua与C交互之前,我们先看看Lua虚拟机与C是如何信息交换的,我们就先需要了解Lua栈。Lua栈是一个抽象的栈,位于C语言和Lua运行时之间。它是一个后进先出(LIFO)的栈。C和Lua都知道栈的规则,都遵守这些规则,就可以进行交流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值