首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

lua调用C函数

Lua采取的是利用栈进行交互,利用各种Lua_pushXXX将不同的值压入栈中,然后调用Lua脚本时自然会退栈取出参数运行,对于Lua的虚拟机来说,就像是发生了一次正常的函数调用。...(这里采用的栈是Lua栈,因为若是C栈的话调用LuaC API就会出错了。)...typedef int (*lua_CFunction) (lua_State *L); 能够被Lua调用C函数都必须是这种规则。函数的返回的int值表示C函数返回值的个数。...void lua_pushcfunction (lua_State *L, lua_CFunction f); 将C函数压栈,接收一个C函数的指针参数,然后将一个Lua.function类型的对象压栈...require("power") print(square(1.44)) 参考 从lua调用C函数 Lua初学者(四)–Lua调用原理展示(lua的堆栈) Lua调用C函数

2.8K31

C语言调用lua

C语言是一种非常流行的编程语言,而Lua是一种基于C语言开发的脚本语言。相信大家都知道,Lua可以使用C语言来扩展其功能,进而实现更复杂的功能。...而在Lua的各种实现中,luajit也是其中一种非常流行的实现。在本篇博客中,我将为大家介绍如何使用C语言调用luajit,并且详细介绍如何传入参数,传入结构体参数,以及获取返回值。...C语言调用luajit 在使用C语言调用luajit之前,我们需要先了解一些必要的概念。首先,我们需要掌握一些基本的lua函数调用的方法。...同时,我们也需要掌握luaL_openlibs函数,它可以打开Lua的标准库,以便我们可以在C语言中使用Lua的函数。 当我们了解了这些基本概念之后,我们就可以开始编写C语言调用luajit的代码了。...C语言向Lua传递参数 当我们需要将C语言中的参数传递给Lua脚本时,我们可以使用lua_push*函数系列将其压入到栈中。这个函数系列包括了很多不同的函数,用于不同类型的参数。

19720
您找到你想要的搜索结果了吗?
是的
没有找到

Lua调用C语言

我们说用Lua可以调用C语言函数,但这并不意味着Lua可以调用所有的C函数。当C语言调用Lua函数时,该函数必须遵循一个简单的规则来传递参数和获取结果。...同样,当Lua调用C函数时,这个C函数也必须遵循某种规则来获取参数和返回结果。此外,当Lua调用C函数时,我们必须注册该函数,即必须以一种恰当的方式为Lua提供该C函数的地址。...Lua调用C函数时,也使用一个与C语言调用Lua函数时相同类型的栈,C函数从栈中获取参数,并将结果压入栈中。 此处的重点在于,这个栈不是一个全局结构;每个函数都有其私有的局部栈。...即使一个C函数调用Lua代码,而且Lua代码又再次调用了同一个C函数,这些调用每一次都只会看到本次调用自己的私有栈,其中索引为1的位置上就是一个参数。...如果你还记得Lua代码本身就是被C代码调用的,那么你应该知道调用顺序类似于:C调用LuaLua调用CC调用Lua

3.7K20

Lua调用C++时打印堆栈信息

更为郁闷的是很多时候并没有使用log输出,在崩溃日志里还无法查看大概在哪一步操作崩溃的… 后来在网上搜索了一下,受到一点启发,lua代码在执行的时候可随时调用debug.traceback()方法来获得调用栈的字符串信息...而c++导出方法给lua调用,是使用tolua++工具实现的,通过ant实现将多个pkg文件生成一个cpp文件。...所以只能在ant的build.xml配置中想办法了,好在ant本身就支持正则的任务“ReplaceRegExp”,在调用的方法前面添加打印堆栈的方法即可。...打印lua调用堆栈的方法: // 打印lua调用栈开始 lua_getglobal(tolua_S, "debug"); lua_getfield(tolua_S, -1, "traceback...flags="g"/> 注: 为换行符 参数资源: lua调用C++函数崩溃时,查看lua调用栈信息 (特别适用于tolua++) cocos2d-x集成lua 导出 C/C++ API 给

2.8K20

Lua函数的冒号调用和点调用

lua冒号函数的定义和调用 冒号定义函数中的self指向函数所属表对象,即self是table类型,通过self表可以:访问挂载在该表下的所有冒号定义函数 如,有定义A={},A:b() A:c();...函数b,c都是冒号定义函数,在b,c函数内部self是地址指向A的表,在b函数中可以通过self:c()来调用c函数,同理在c函数中也可以通过self:b()来调用b函数 代码示例: local tb...function tb:test() self:func1() self:func2() end tb:test() --调用func1 --调用func2 lua点函数的定义和调用 总之lua...点定义的函数中self=nil,不像冒号定义函数那样可以self指向函数所属对象 点调用冒号定义函数 点调用冒号定义函数,第一个参数传递给self,调用无参时,self=nil local tb={name...--------------- self= nil parm1= table: 0x000393c0 parm2= 第一个参数 all: local tb={name="tb"} function tb

3.2K20

Linuxlua安装以及和c的交互

ncurses-devel tar -zxvf lua-5.1.4.tar.gz cd lua-5.1.4 make linux test make install 至此lua模块安装完成...,开始和c语言的交互之旅行吧 网上很多介绍clua交互的,但是在linux下面的编译介绍却没找到,在此自己记录下,也方便大家查看 在lua模块安装完成后,可以用命令find / -name ‘lua.h...1实现自己的第一个c调用C的例子 test.lua print("lua script test.lua have been load--") function showinfo() print...gcc test.c -o test -llua -lm -ldl 2实现自己的第一个lua调用C的例子 c_lua.c #include #include...llua -lm -ldl Ok啦,经历好几天的迷雾,终于在linux跑起来了,还不太会写博客,就此小小记录下,也希望能带给一些和我一样有迷惑的朋友帮助

75020

C++调用lua 运行方式、案例亲测 及 常用API

LuaC语言之间进行数据交换时,由于两种语言之间有着较大的差异,比如Lua是动态类型,C语言是静态类型,Lua是自动内存管理,而C语言则是手动内存管理。...为了解决这些问题,Lua的设计者使用了虚拟栈作为二者之间数据交互的介质。在C/C++程序中,如果要获取Lua的值,只需调用LuaC API函数,Lua就会将指定的值压入栈中。...要将一个值传给Lua时,需要先将该值压入栈,然后调用LuaC API,Lua就会获取该值并将其从栈中弹出。...常用API 压入元素 Lua针对每种C类型,都有一个C API函数与之对应,如: void lua_pushnil(lua_State* L); --nil值 void lua_pushboolean...lua_pcall 最后一个参数 errfunc,指定错误处理函数在 Lua 栈中的位置 一般系统嵌入 Lua 代码,都是使用 lua_pcall,调用方法一般都是: lua_pcall (l, 0,

95810

lua调用c语言so动态库--以waf中证书检查为例

​ 需求 在基于nginx做waf开发时,nginx+lua+c动态库是常见的开发模式,在lua生态无法满足需求时,就需要我们在lua代码中调用动态库的方式,进行扩展,下面以lua调用c语言+openssl...动态库的方式,进行判断证书的创建时间和证书的过期时间为例,进行说明 由于lua没有openss sdk做证书检查校验工作,那么就需要我们基于c语言和openssl库些一个so动态库,以供lua调用去判断证书有效时间...在lua调用c函数时,通过lua_State *L向其传入参数,如果只有一个参数且类型为string,那么在c函数中通过lua_tostring(L,1),获取传来的一个string类型的参数。...(L,1),获取lua传来的证书路径,随后在c语言的函数中调用openssl函数进行一些列的操作。...int luaopen_libcert(lua_State *L) { luaL_register(L,"libcert",lib); return 1; } lua代码调用c动态库

1.7K30

Linux下跨语言调用C++实践

本文以美团搜索实际场景下的案例,讲述在Linux系统下跨语言调用的实践,即开发一次C++语言的组件,其他语言通过跨语言调用技术调用C++组件。...2 方案概述 为了达到业务方开箱即用的目的,综合考虑C++、Python、Java用户的使用习惯,我们设计了如下的协作结构: 图 1 3 实现详情 Python、Java支持调用C接口,但不支持调用C...为了保证签名唯一,C++通过name mangling机制为相同名字不同实现的函数生成不同的签名,生成的签名会是一个像__Z4funcPN4printE这样的字符串,无法被dlsym识别(注:Linux...图 3 4.2.2 调用过程 前文提到,native方法调用前,需要将其所在的动态库加载到内存中,这个过程是利用Linux的dlopen实现的,JVM会把动态库中的代码片段放到Native Code区域...7 参考文献 JNI内存相关文档 JNI类型映射 JNA开源地址 Linux dlopen Linux dlclose Linux dlsym CPython源码 CPython中ctypes的介绍 CTypes

5.8K40
领券