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相互调用例子程序,lua与C相互调用例子程序
lua和c语言之间相互调用实例
前言 第一次接触Lua是因为Unity游戏中需要热更,但是一直没搞懂Lua是怎么嵌入到别的...lua与C的相互调用在工程中相当实用,本文就来讲解lua与C相互调用的方法。这次打算好好了解一下C跟lua是如何交互的 那么如何使用L
delphi7与lua相互调用的例子,基本和法和C调用lua差不多
直接以JNI方式调用Lua解析引擎的接口十分麻烦,开源项目LuaJava(https://github.com/mkottman/AndroLua )对这些JNI接口进行了很好的封装,它是一个包含了LuaJava的Android平台的Lua解析器,它提供一系列映射到Lua ...
lua与oc的交互demo,封装了一层luaBridge,开源lua库,lua调用oc的过程
lua 和 C 语言的相互调用完整示例(vc6.0) 参见压缩包里面的 ReadmeZq.txt 示例代码来源于互联网,不过以前不是完整代码,我整合了下,并全部测试通过。
详细描述Lua和C之间相互传递Table类型数据 /* ====================================================== */ // 遍历Lua传入的Table类型参数, 获取它的Key/Value, 其关键操作是 lua_next() // lua_next() 返回1表示...
lua是一种脚本语言,可以方便的移植到各种宿主语言中,并且可以支持热更新,在游戏开发中也能当做主要的语言来编写游戏的逻辑,所以这篇文章主要给大家介绍了关于C#和lua相互调用的方法教程,需要的朋友可以参考下。
此PPT简单介绍了Lua的特性,用处等,并用简单的示例代码说明Lua与C之间的相互调用。此资源来源于网络,PPT最后有源作者博客。
lua-cjson 是一个简单小巧的开源动态库,可被 Lua 脚本 require 加载在 Lua 中通过一系列的 lua-cjson API 调用完成 Lua 值与 Json 值的相互转换(编码及解码)。 使用方式参考:...
本文主要介绍通过在c中运行python脚本来实现python与c的相互调用,并通过c和python脚本设置同一段内存区域为例子来讲解。 准备工作 为了在c中运行python脚本,需要在程序链接的时候将python虚拟机库链接进去,...
学习C/C++如何与lua之间相互调用,掌握lua底层原理并熟练C++与lua结合使用。
其提供了与多种平台的功能交互,让开发者无须关心Lua与各个平台之间是实现相互作用的细节,只需要根据自己的业务需求,使用LuaScriptCore提供的方法,轻松简单地实现各种功能。 原生代码调用Lua中的方法和变量,控制...
xLua为Unity、 .Net、 Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用。 xLua的突破 xLua在功能、性能、易用性都有不少突破,这几方面分别最具代表性的是: 可以运行时把C#实现...
C#下Lua编程支持xLua为Unity,.Net,Mono等C#环境增加了Lua脚本编程的能力,可以使用xLua,这些Lua代码可以方便的和C#相互调用。xLua的突破xLua在功能,性能,易用性都有过多的突破,这几方面分别具有代表性的是...
xLua为Unity、 .Net、 Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用。 ## xLua的突破 xLua在功能、性能、易用性都有不少突破,这几方面分别最具代表性的是: * 可以运行时把...
调用图显示了函数在程序中如何相互调用。 每个椭圆代表一个函数,每个箭头表示一个函数调用。 在下图中,主程序由节点 MAIN 表示。 它调用 6 个函数,其中一个调用 9 个其他函数。 callGraph 静态生成调用图图像并将...
xLua为Unity,.Net,Mono等C#环境增加了Lua脚本编程的能力,可以使用xLua,这些Lua代码可以方便的和C#相互调用。 xLua的突破 xLua在功能,性能,易用性都有过多的突破,这几方面分别具有代表性的是: 可以运行时把...