Lua调用C函数

在上一篇文章(C调用lua函数)中,讲述了如何用c语言调用lua函数,通常,A语言能调用B语言,反过来也是成立的。正如Java

与c语言之间使用JNI来互调,Lua与C也可以互调。

当lua调用c函数时,使用了和c调用lua中的同一种栈,c函数从栈中得到函数,然后将结果压入栈中。为了区分返回结果和栈中的其他值,每一个函数返回结果的个数。

这里有个重要的概念:这个栈不是全局的结构,每个函数都有自己的私有局部栈。哪怕c函数调用了lua代码,lua代码再次调用该c函数,他们有各自独立的局部栈。第一个参数的索引是1。

作为第一个例子,让我们看看如何实现一个简单的函数,返回给定2个参数的和:

static int l_plus(lua_State* L)

{

lua_Integer a = lua_tointeger(L, 1);

lua_Integer b = lua_tointeger(L, 2);

lua_pushinteger(L, a+b);

return 1;

}

每一个Lua注册的函数都必须是这个原型,它已经在lua.h中定义了:

typedef int (*lua_CFunction) (lua_State *L);

由于c函数返回了一个int类型的返回值个数。因此,当压入返回值之前,不必要清理栈,lua会自动移除返回值下面的任何数据。

在lua中使用该函数之前,我们需要注册它。使用lua_pushcfunction,它接受一个c函数,然后在lua内部创建一个函数类型的值来表示该函数。

lua_pushcfunction(L, lua_plus);

lua_setglobal(L, "myplus");

一个专业点的写法是,我们必须检查它的参数类型:

static int l_plus(lua_State* L)

{

lua_Integer a = luaL_checkinteger(L, 1);

lua_Integer b = luaL_checkinteger(L, 2);

lua_pushinteger(L, a+b);

return 1;

}

完整代码:

/*

* http://blog.csdn.net/booirror

*/

#include <lua.h>

#include <lauxlib.h>

#include <lualib.h>

static int l_plus(lua_State* L)

{

lua_Integer a = luaL_checkinteger(L, 1);

lua_Integer b = luaL_checkinteger(L, 2);

lua_pushinteger(L, a+b);

return 1;

}

int main()

{

lua_State *L = luaL_newstate();

luaL_openlibs(L);

lua_pushcfunction(L, l_plus);

lua_setglobal(L, "myplus");

if (luaL_dostring(L, "print(myplus(2,2))")) {

lua_close(L);

error("Failed to invoke");

}

lua_close(L);

return 0;

}

(完)

时间: 2024-10-13 12:24:20

Lua调用C函数的相关文章

Step By Step(Lua调用C函数)

原文: http://www.cnblogs.com/stephen-liu74/archive/2012/07/23/2469902.html Lua可以调用C函数的能力将极大的提高Lua的可扩展性和可用性.对于有些和操作系统相关的功能,或者是对效率要求较高的模块,我们完全可以通过C函数来实现,之后再通过Lua调用指定的C函数.对于那些可被Lua调用的C函数而言,其接口必须遵循Lua要求的形式,即typedef int (*lua_CFunction)(lua_State* L).简单说明一下

lua调用c++函数返回值作用

2015/05/28 lua调用c++接口,返回给lua函数的是压入栈的内容,可以有多个返回值.但是c++接口本身也是有返回值的,这个返回值也非常的重要,会决定最后返回到lua函数的值的个数. (1)c++自定义类 int Test::getMsg(lua_State* L){ lua_pushnumber(L, 100); lua_pushnumber(L, 200); return 2; } (2)tolua++导出的lua调用的c++接口(部分有修改) int lua_cocos2dx_c

cocos2dx中使用tolua++使lua调用c++函数

一直想学学cocos2dx中如何使用tolua++工具使得lua脚本调用C++函数,今天就来搞一下,顺便记录下来: 首先,我们打开cocos2dx-2.2.4中projects下的test的VS工程,可以看到这个例子里面已经有一个HelloWorld的类,我们就用它来说明一下. 然后,我们照着HelloWorld类的定义来写pkg文件: //MyClass.pkg class HelloWorld : public cocos2d::CCLayer { virtual bool init();

Lua调用C函数的实现

看Lua有一段时间了,说实话进展挺慢的.归根到底是因为"动机不纯",我确实不是抱着学Lua的心态去看资料的.本来看Lua就是听说Lua的实现比较简单,可以借Lua理解解释性语言的一些细节实现.当然Lua也确实不简单的,闭包什么的概念以前都没听说过.没用过Lua却去硬啃Lua语言实现,我也是蛮拼的! 我主要的参考资料是云风大神的<Lua源码赏析>和高手翻译的<LUA中文教程>.这里我想记录一下函数调用的过程.按照函数调用这条线串联一下各各知识点.首先要从字节码开始

Lua中调用C函数

Lua利用一个虚拟的堆栈来给C传递值或从C获取值.每当Lua调用C函数,都会获得一个新的堆栈,该堆栈初始包含所有的调用C函数所需要的参数值(Lua传给C函数的调用实参),并且C函数执行完毕后,会把返回值压入这个栈(Lua从中拿到C函数调用结果). 于此相关的C API有几个比较重要的定义如下: (1)typedef struct lua_State lua_State; lua虚拟机(或叫解释器),可以理解为一个thread,和一个完整的Lua虚拟环境的执行状态. (2)typedef int

lua调用C语言

在上一篇文章(C调用lua函数)中,讲述了如何用c语言调用lua函数,通常,A语言能调用B语言,反过来也是成立的.正如Java 与c语言之间使用JNI来互调,Lua与C也可以互调. 当lua调用c函数时,使用了和c调用lua中的同一种栈,c函数从栈中得到函数,然后将结果压入栈中.为了区分返回结果和栈中的其他值,每一个函数返回结果的个数. 这里有个重要的概念:这个栈不是全局的结构,每个函数都有自己的私有局部栈.哪怕c函数调用了lua代码,lua代码再次调用该c函数,他们有各自独立的局部栈.第一个参

Lua_第25章 调用 C 函数

第25章 调用 C 函数  扩展 Lua 的基本方法之一就是为应用程序注册新的 C 函数到 Lua中去. 当我们提到 Lua 可以调用 C 函数,不是指 Lua 可以调用任何类型的 C 函数(有一些包可以让 Lua 调用任意的 C 函数,但缺乏便捷和健壮性).正如我们前面所看到的,当C 调用 Lua函数的时候,必须遵循一些简单的协议来传递参数和获取返回结果.相似的, 从Lua 中调用 C 函数,也必须遵循一些协议来传递参数和获得返回结果.另外,从 Lua 调用 C 函数我们必须注册函数,也就是说

cocos进阶教程(1)Lua调用自定义C++类和函数的最佳实践

第一层:纯C环境下,把C函数注册进Lua环境 a.lua 文件 print(foo(99)) a.c 文件 #include <lua.h> #include <lualib.h> #include <lauxlib.h> int foo(lua_State *L) { int n = lua_tonumber(L, 1); lua_pushnumber(L, n + 1); return 1; } int main() { lua_State *L = lua_ope

Lua 与C/C++ 交互系列: Lua调用C/C++函数(4-2)

1.本文继续讲解Lua调用C/C++函数,本文的重点是通过metatable来实现Lua Code面向对象调用注册的C函数.本文中涉及的Environment 伪索引,userdata 以及GC 垃圾回收器的内容,都是简单的讲解.不作为本文的重点,这些内容都将在以后的章节中继续讲解. 2.本文涉及的到主要知识点补充说明. 2.1 void *lua_newuserdata (lua_State *L, size_t size); 函数说明 This function allocates a ne