Lua 提供了强大的API用于与C间的交互,两者值间的传递通过虚拟堆栈来实现。
一. 实现Lua解释器
/** * Lua 解释器 */ int main( int argc, char **argv ) { // 初始化解释器 lua_State *pl = luaL_newstate(); // 加载基础库,包括io,os,math等 luaL_openlibs( pl ); // 执行lua脚本 luaL_dofile( pl, "./hello.lua" ); lua_close( pl ); return 0; }
上述少许代码实现了lua解释器,运行打印hello world。
二. C调用Lua函数
2.1 Lua函数实现
-- add function add( x, y ) return x + y end
2.2 调用Lua函数
/** * lua通过虚拟堆栈来传递值 * */ int luaadd( lua_State *l, int x, int y ) { // 通过lua中的add() lua_getglobal( l, "add" ); // 参数x入栈 lua_pushnumber( l, x ); // 通统y入栈 lua_pushnumber( l, y ); // 调用,nargs=2,nresults=1 lua_call( l, 2, 1 ); // 强转(栈顶元素) int sum = (int)lua_tointeger( l, -1 ); // 堆栈平衡 lua_setglobal( l, "add ); return sum; } /** * C调用lua测试 * */ int Calllua_test() { // init lua_State *l = luaL_newstate(); luaL_openlibs( l ); // 执行lua脚本 luaL_dofile( l, "./add.lua" ); // 调用lua的add() int sum = luaadd( l, 10, 15 ); printf( "Lua add: %d\n", sum ); lua_close( l ); return 0; }
执行结果:
Lua add: 25
三. Lua调用C
3.1 Lua调用代码
-- average function main() local avg, sum = average( 2, 2, 3, 5 ) print( "avg: ", avg ) print( "sum: ", sum ) end main()
3.2 C平均值实现
/** * 求取平均数 */ static int average( lua_State *l ) { // 获取参数个数 int n = lua_gettop( l ); double sum = 0; int i = 0; for( i=1; i<=n; i++ ) { sum += lua_tonumber( l, i ); } // 压入平均值 lua_pushnumber( l, sum/n ); // 压入和 lua_pushnumber( l, sum ); // 返回值个数 return 2; } /** * Lua调用C测试 * */ int Callc_test() { // init lua_State *l = luaL_newstate(); luaL_openlibs( l ); // register lua_register( l, "average", average ); // do luaL_dofile( l, "./avg.lua" ); lua_close( l ); return 0; }
执行结果:
avg: 3.0 sum: 12.0
参数链接:
http://www.lua.org/manual/5.3/manual.html
http://www.jb51.net/article/72661.htm
相关推荐
这个“lua与C相互调用例子程序”很可能是为了展示这种交互机制。 1. Lua C API:这是C代码与Lua交互的基础,它提供了一系列的函数,如luaL_newstate创建Lua虚拟机,luaL_loadbuffer或luaL_loadfile加载并编译Lua...
本篇将深入探讨Lua与C语言之间的相互调用实例,帮助你理解如何在这两种语言间实现无缝交互。 首先,Lua是一种轻量级的脚本语言,它被设计成嵌入到主应用程序中,以提供灵活的配置和扩展功能。而C语言则是一种广泛...
本示例探讨了如何在Delphi 7环境中实现与Lua脚本语言的相互调用,这在游戏开发、自动化工具或扩展应用程序功能时非常有用。Delphi是Pascal语言的一个强大的IDE,而Lua则是一种轻量级的脚本语言,以其简洁和可嵌入性...
这个压缩包文件“lua_with_c”提供了一个关于Lua和C语言相互调用的完整示例,特别适用于使用Visual C++ 6.0(VC6.0)这一经典开发环境的开发者。Lua是一种轻量级的脚本语言,常用于游戏开发、配置文件、自动化任务等...
本文将深入探讨如何在Visual C++(简称VC)环境中与lua进行交互,实现两者之间的相互调用。 首先,我们需要在VC项目中集成lua库。这通常涉及到下载lua源码,将其编译为适用于VC的动态链接库(.dll)或静态链接库(....
直接以JNI方式调用Lua解析引擎的接口十分麻烦,开源项目LuaJava(https://github.com/mkottman/AndroLua )对这些JNI接口进行了很好的封装,它是一个包含了LuaJava的Android平台的Lua解析器,它提供一系列映射到Lua ...
总的来说,这个"OC与Lua交互调用(不使用第三方库)Demo"提供了一个基础框架,演示了如何在不依赖外部库的情况下实现Objective-C和Lua的通信。通过自定义的`luaBridge`,开发者可以更好地控制和优化交互过程,同时也...
Android与Lua之间可以相互传递各种类型的数据,包括数字、字符串、布尔值、表等。在Java中,Lua值可以通过LuaState的API转换为Java对象,反之亦然。例如,从Lua传递一个表到Java: ```lua local table = {key1=...
详细描述Lua和C之间相互传递Table类型数据 /* ====================================================== */ // 遍历Lua传入的Table类型参数, 获取它的Key/Value, 其关键操作是 lua_next() // lua_next() 返回1表示...
汇编函数与C函数的相互调用 在计算机编程中,汇编语言和C语言都是常用的编程语言。汇编语言是低级语言,直接操作计算机硬件,而C语言是高级语言,需要编译器将其转换为机器代码。两种语言之间的相互调用是非常重要...
C API为Lua提供了与C语言相互操作的一系列函数,允许开发者从Lua脚本中调用C语言编写的函数,以及从C/C++代码中调用Lua语言编写的脚本。这是实现Lua与C++交互的基础。在Lua脚本中模拟消息事件机制,意味着可以将事件...
Lua支持使用模块机制来组织代码,允许文件之间以模块的方式相互调用。例如,下面是一个简单的模块文件示例: ```lua -- p.lua local print = print module("p") function Vprint() print("p") end ``` 通过运行...
JNI在LuaJava的实现中起着至关重要的作用,因为它提供了一个安全的桥梁,让Java和C/C++代码能够相互调用。 "libluajava-1.1.so" 是LuaJava的具体实现,这是一个动态链接库,包含了LuaJava的核心功能。在Android应用...
此PPT简单介绍了Lua的特性,用处等,并用简单的示例代码说明Lua与C之间的相互调用。此资源来源于网络,PPT最后有源作者博客。
Lua提供了丰富的C语言API,使得开发者能够轻松地在C程序中嵌入Lua解释器,实现脚本驱动的功能。 - **栈操作**:如`lua_pushvalue`、`lua_pop`等。 - **栈大小**:如`lua_gettop`、`lua_settop`等。 - **索引**:如`...
lua-cjson 是一个简单小巧的开源动态库,可被 Lua 脚本 require 加载在 Lua 中通过一系列的 lua-cjson API 调用完成 Lua 值与 Json 值的相互转换(编码及解码)。 使用方式参考:...
准备阶段还需要将Lua源代码文件整理并放置于指定位置,例如`source/lua`目录下,并确保删除不必要的文件(如`makefile`、`lua.c`和`luac.c`)。这一步是为了简化之后的操作流程,确保移植过程更加顺畅。 **1.6 组织...