`
tcspecial
  • 浏览: 911577 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Lua与C相互调用

    博客分类:
  • OS
阅读更多

 

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

    lua和c语言之间相互调用实例

    本篇将深入探讨Lua与C语言之间的相互调用实例,帮助你理解如何在这两种语言间实现无缝交互。 首先,Lua是一种轻量级的脚本语言,它被设计成嵌入到主应用程序中,以提供灵活的配置和扩展功能。而C语言则是一种广泛...

    delphi7与lua相互调用的例子

    本示例探讨了如何在Delphi 7环境中实现与Lua脚本语言的相互调用,这在游戏开发、自动化工具或扩展应用程序功能时非常有用。Delphi是Pascal语言的一个强大的IDE,而Lua则是一种轻量级的脚本语言,以其简洁和可嵌入性...

    lua 和 C 语言的相互调用完整示例(vc6.0)

    这个压缩包文件“lua_with_c”提供了一个关于Lua和C语言相互调用的完整示例,特别适用于使用Visual C++ 6.0(VC6.0)这一经典开发环境的开发者。Lua是一种轻量级的脚本语言,常用于游戏开发、配置文件、自动化任务等...

    VC和lua相互调用的例子

    本文将深入探讨如何在Visual C++(简称VC)环境中与lua进行交互,实现两者之间的相互调用。 首先,我们需要在VC项目中集成lua库。这通常涉及到下载lua源码,将其编译为适用于VC的动态链接库(.dll)或静态链接库(....

    Lua 学习教程 Android与Lua相互调用

    直接以JNI方式调用Lua解析引擎的接口十分麻烦,开源项目LuaJava(https://github.com/mkottman/AndroLua )对这些JNI接口进行了很好的封装,它是一个包含了LuaJava的Android平台的Lua解析器,它提供一系列映射到Lua ...

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

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

    lua与Android交互,基本实现

    Android与Lua之间可以相互传递各种类型的数据,包括数字、字符串、布尔值、表等。在Java中,Lua值可以通过LuaState的API转换为Java对象,反之亦然。例如,从Lua传递一个表到Java: ```lua local table = {key1=...

    Lua跟C之间交互Table

    详细描述Lua和C之间相互传递Table类型数据 /* ====================================================== */ // 遍历Lua传入的Table类型参数, 获取它的Key/Value, 其关键操作是 lua_next() // lua_next() 返回1表示...

    汇编函数与C函数的相互调用.docx

    汇编函数与C函数的相互调用 在计算机编程中,汇编语言和C语言都是常用的编程语言。汇编语言是低级语言,直接操作计算机硬件,而C语言是高级语言,需要编译器将其转换为机器代码。两种语言之间的相互调用是非常重要...

    脚本语言Lua与C交互方法的研究与实现

    C API为Lua提供了与C语言相互操作的一系列函数,允许开发者从Lua脚本中调用C语言编写的函数,以及从C/C++代码中调用Lua语言编写的脚本。这是实现Lua与C++交互的基础。在Lua脚本中模拟消息事件机制,意味着可以将事件...

    LUA 轻松入门

    Lua支持使用模块机制来组织代码,允许文件之间以模块的方式相互调用。例如,下面是一个简单的模块文件示例: ```lua -- p.lua local print = print module("p") function Vprint() print("p") end ``` 通过运行...

    LuaJava在Android平台的动态链接库文件

    JNI在LuaJava的实现中起着至关重要的作用,因为它提供了一个安全的桥梁,让Java和C/C++代码能够相互调用。 "libluajava-1.1.so" 是LuaJava的具体实现,这是一个动态链接库,包含了LuaJava的核心功能。在Android应用...

    Lua精简教程

    此PPT简单介绍了Lua的特性,用处等,并用简单的示例代码说明Lua与C之间的相互调用。此资源来源于网络,PPT最后有源作者博客。

    Lua学习 中午参考手册

    Lua提供了丰富的C语言API,使得开发者能够轻松地在C程序中嵌入Lua解释器,实现脚本驱动的功能。 - **栈操作**:如`lua_pushvalue`、`lua_pop`等。 - **栈大小**:如`lua_gettop`、`lua_settop`等。 - **索引**:如`...

    lua-cjson和LuaJIT.zip

    lua-cjson 是一个简单小巧的开源动态库,可被 Lua 脚本 require 加载在 Lua 中通过一系列的 lua-cjson API 调用完成 Lua 值与 Json 值的相互转换(编码及解码)。 使用方式参考:...

    Lua移植到标准ANSI C环境

    准备阶段还需要将Lua源代码文件整理并放置于指定位置,例如`source/lua`目录下,并确保删除不必要的文件(如`makefile`、`lua.c`和`luac.c`)。这一步是为了简化之后的操作流程,确保移植过程更加顺畅。 **1.6 组织...

Global site tag (gtag.js) - Google Analytics