`
fantaxy025025
  • 浏览: 1309094 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

lua编程之lua与C相互调用-和例子代码

    博客分类:
  • lua
 
阅读更多

=

=

=

lua编程之lua与C相互调用 https://www.cnblogs.com/coderkian/p/4057750.html

lua是扩展性非常良好的语言,虽然核心非常精简,但是用户可以依靠lua库来实现大部分工作。除此之外,lua还可以通过与C函数相互调用来扩展程序功能。在C中嵌入lua脚本既可以让用户在不重新编译代码的情况下修改lua代码更新程序,也可以给用户提供一个自由定制的接口,这种方法遵循了机制与策略分离的原则。在lua中调用C函数可以提高程序的运行效率。lua与C的相互调用在工程中相当实用,本文就来讲解lua与C相互调用的方法。

Lua与C相互调用的首要问题是如何交换数据,lua API使用了一个抽象的栈与C语言交换数据,提供了压入元素,查询元素和弹出元素等功能的API操作栈,这里可以查看lua5.2中每个函数的详细文档,栈中的元素可以通过索引访问,从栈底向上是从1开始递增的正整数,从栈顶向下是从-1开始递减的负整数,栈的元素按照FIFO的规则进出。

一、 C调用lua

先通过一个简单的例子了解C是怎么调用lua的,

复制代码
//test.lua
width = 10
height = 20

//test.c
#include <stdio.h>
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>

int main() {
  lua_State *L = luaL_newstate();
  luaL_openlibs(L);

  if(luaL_loadfile(L, "test.lua") || lua_pcall(L, 0,0,0)){
    printf("error %s\n", lua_tostring(L,-1));
    return -1;
  }
  lua_getglobal(L,"width");
  lua_getglobal(L,"length");
  printf("width = %d\n", lua_tointeger(L,-2));
  printf("length = %d\n", lua_tointeger(L,-1));
  lua_close(L);
  return 0;
}
复制代码

luaL_newstate创建一个新的lua_State,C和lua的所有操作都要依赖这个lua环境, luaL_openlibs将lualib.h中定义的lua标准库加载到进lua_State。

luaL_loadfile从文件中加载lua代码并编译,编译成功后的程序块被压入栈中,

lua_pcall会将程序块弹出并在保护模式下解释执行。代码中调用lua_pcall就在lua_State中定义了 width和 length两个全局变量。

lua_getglobal将全局变量的值压入栈中,width先入栈,在-2的位置,length在栈顶。

除了变量,C代码还可以直接调用lua中定义的函数

复制代码
//test.lua
function add(x, y)
  return x+y
end
//test.c
#include <stdio.h>
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#include <math.h>

int main() {
  lua_State *L = luaL_newstate();
  luaL_openlibs(L);

  if(luaL_loadfile(L, "test.lua") || lua_pcall(L, 0,0,0)){
    printf("error %s\n", lua_tostring(L,-1));
    return -1;
  }
  lua_getglobal(L,"add");
  lua_pushnumber(L, 10);
  lua_pushnumber(L, 20);
  if(lua_pcall(L, 2, 1, 0) != 0){
    printf("error %s\n", lua_tostring(L,-1));
    return -1;
  }
  double z = lua_tonumber(L, -1);
  printf("z = %f \n", z);
  lua_pop(L, 1);
  lua_close(L);
  return 0;
}
复制代码

lua_pcall(L, 2, 1, 0)表示,传入两个参数,期望得到一个返回值,0表示错误处理函数在栈中的索引值,压入结果前会弹出函数和参数,所以z的索引是-1.

二、 lua调用C

lua可以将C函数注册到lua中,C函数必须遵循统一的原型,这个原型定义在lua.h中,

typedef int (*) (lua_State *)

用C函数扩展lua时,一般将所有的C函数编译成一个独立的模块,方便增加新的函数。

复制代码
//mylib.c
#include <stdio.h>
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#include <math.h>

static int myadd(lua_State *L){
                int a = luaL_checknumber(L, 1);
                int b = luaL_checknumber(L, 2);
                lua_pushnumber(L, a+b);
                return 1;
}

static const struct luaL_Reg mylib [] = {
        {"add", myadd}, 
        {NULL, NULL}
};

int luaopen_mylib(lua_State *L){
  luaL_newlib(L, mylib);
  return 1;
}

//call.lua
#!/usr/local/bin/lua

lib=require "mylib"
print(lib.add(1, 2))
复制代码

每个被lua调用的C函数都有自己的私有栈,压入参数的索引从1开始递增,结果值也是直接压入栈中,函数返回时会将压入的参数全部删除,只留下结果值。mylib[]声明了模块中所有C函数列表,每一项映射了C函数在lua中的命名,比如上面代码中myadd函数在lua中用add表示,列表必须用{NULL, NULL}结束。 luaL_newlib在栈中创建一个table,将mylib数组中的C函数注册进这个table中。 luaopen_mylib将这个table中的函数加载进lua环境中。

先将C代码编译成动态链接库,

gcc -shared -fPIC -o mylib.so mylib.c -llua -lm -ldl

lua代码中,require会查找 mylib.so,并调用该链接库中的 luaopen_mylib,luaopen_的后缀必须与动态链接库名字一样,这是由require查找函数方式决定的。

作者:coderkian 
出处:http://www.cnblogs.com/coderkian/ 

 

=

=

=

 

分享到:
评论

相关推荐

    delphi7与lua相互调用的例子

    总结来说,"delphi7与lua相互调用的例子"是一个关于如何在Delphi 7应用程序中嵌入和调用Lua脚本的实例。它展示了如何利用DLL接口将这两种语言的强项结合在一起,为开发带来更多的可能性。通过深入理解这个示例,...

    lua与C相互调用例子程序

    这个“lua与C相互调用例子程序”很可能是为了展示这种交互机制。 1. Lua C API:这是C代码与Lua交互的基础,它提供了一系列的函数,如luaL_newstate创建Lua虚拟机,luaL_loadbuffer或luaL_loadfile加载并编译Lua...

    OC与Lua交互调用(不使用第三方库)Demo

    总的来说,这个"OC与Lua交互调用(不使用第三方库)Demo"提供了一个基础框架,演示了如何在不依赖外部库的情况下实现Objective-C和Lua的通信。通过自定义的`luaBridge`,开发者可以更好地控制和优化交互过程,同时也...

    易语言lua的例子

    5. **测试.e**:这是一个易语言的源代码文件,很可能包含了如何在易语言程序中调用Lua的示例代码,供学习者参考和实践。 6. **lua.e**:这可能是另一个与Lua相关的易语言源代码文件,可能包含更具体的Lua交互操作...

    Delphi lua调用例子

    当我们谈论"Delphi lua调用例子"时,我们通常是指在Delphi应用程序中集成和使用Lua脚本的能力。这种集成允许开发者利用Lua的灵活性和简洁性来编写部分业务逻辑或游戏逻辑,同时利用Delphi的强大图形界面和系统访问...

    lua 调用 c++ dll 示例

    在IT领域,有时候我们需要在不同的编程语言之间进行交互,例如使用脚本语言 Lua 调用 C++ 编写的动态链接库(DLL)。本示例是关于如何在 Lua 中调用由 Visual Studio 2010 编译的 C++ DLL 的教程。下面将详细介绍这...

    delphi调用lua脚本的一个例子

    在本文中,我们将深入探讨如何在Delphi编程环境中调用Lua脚本,以实现更灵活的逻辑处理和功能扩展。Delphi是一款强大的Object Pascal集成开发环境(IDE),而Lua则是一种轻量级、高效的脚本语言,常用于游戏开发和...

    lua_c_lua_c

    文件名暗示了这个例子会展示如何从Lua调用C函数。 在这个例子中,我们可能会遇到以下知识点: 1. **Lua API for C**: Lua提供了一套C语言的API,允许C代码与Lua环境进行交互。这包括创建和初始化Lua状态机,加载和...

    lua教程--轻松学习lua

    通过实际的代码示例,你可以了解如何在Lua中进行基本操作,如变量声明、运算符使用、函数定义与调用,以及如何利用表进行数据存储和处理。此外,这个文档可能还会介绍如何使用Lua的元表和元方法来实现面向对象编程,...

    lua-cURL访问http/https

    Lua-cURL是一个用于在Lua环境中实现HTTP和HTTPS访问的库,它是基于著名的C语言库cURL构建的。这个库提供了全面的功能,使得Lua脚本能够方便地与Web服务进行交互,比如发送GET、POST请求,处理cookies,上传文件,...

    lua_test.rar_C++_c# lua_c++ lua_lua_lua调用C++

    在这个实例中,C++工程可能已经包含了这样的库,并定义了一些可被Lua调用的函数。这些函数可以用来执行特定的任务,如计算、数据处理或者控制C++对象的行为。 接下来,让我们看看"lua_test"这个文件。这可能是一个...

    Delphi_LUA的例子

    3. `luainterface.pas` - 这可能是LUA与Delphi交互的接口文件,定义了如何在Delphi中调用LUA的函数,以及如何在LUA中调用Delphi的对象和方法。 在实践中,我们需要注意的两个关键点是: 1. 路径管理:由于不同的...

    LUA全套帮助文档,里面有LUA的例子和LUA的全部资料

    7. **C API**:LUA的C API允许开发者用C语言编写扩展,将C函数暴露给LUA脚本调用,或者在C代码中调用LUA函数。 8. **性能优化**:LUA的解释器设计高效,但为了进一步提升性能,开发者可能需要理解LUA的内存管理和...

    C++控制台与Lua交互,打开浏览器网页

    本文将深入探讨如何在C++控制台应用中实现与Lua的交互,并展示如何通过Lua调用C++代码来打开浏览器访问网页。 首先,让我们了解C++和Lua的基本概念。C++是一种强大且高效的静态类型编程语言,广泛应用于系统软件、...

    Programming In Lua 中文版PDF高清

    - 综合实践各种Lua编程技巧。 - 解决实际问题的方法。 #### 第二篇 tables与objects **第11章 数据结构** - **简述**:深入分析了Lua中最常用的数据结构——表(table)的特性和使用技巧。 - **知识点**: - 表...

    luaclass简单例子

    总的来说,"luaclass简单例子"涵盖了如何在Lua中实现面向对象编程的基本思路,包括类的模拟、对象的创建和方法的定义。通过`classheader.lua`、`Team.lua`和`TeamMgr.lua`这三份文件,我们可以看到一个从基础类模板...

    Go-Lua5.2VM的一个纯Go实现

    Go-Lua5.2VM就是这样一个例子,允许Go程序调用和执行Lua代码,从而实现动态控制和自定义行为。 4. Go-Lua5.2VM实现 Go-Lua5.2VM是用Go语言从头实现的Lua 5.2虚拟机。这意味着它可以无缝地与Go程序集成,而无需依赖...

    OpenWrt UCI详解(C和Lua语言使用uci接口实例).docx

    UCI允许用户通过命令行工具或编程接口(如C语言和Lua)来读取、修改和保存配置状态,使得OpenWrt设备的配置更加灵活和高效。 2. uci 配置格式 UCI配置文件通常位于/etc/config/目录下,以文本形式存储,每个配置...

    天龙LUA例子

    【天龙LUA例子】是一个专门针对天龙八部游戏的LUA编程示例集合,旨在帮助初学者和有经验的开发者更好地理解和运用LUA语言进行游戏脚本编写。LUA是一种轻量级的脚本语言,常用于游戏开发,因其简洁的语法和高效的执行...

    lua api lua文档

    《Programming in Lua》一书由Lua的主要开发者之一 Roberto Ierusalimschy 撰写,深入浅出地介绍了Lua语言的核心概念及其在实际编程中的应用。 #### 二、Lua语言基础 ##### 1. Chunks - **定义**:Lua程序的基本...

Global site tag (gtag.js) - Google Analytics