lua与c的交互(运用)

Posted gd-luojialin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lua与c的交互(运用)相关的知识,希望对你有一定的参考价值。

(1)lua程序

技术图片

 

(2)C++程序(头文件)

extern "C"

    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
;class CLuaFn
public:
    CLuaFn(void);
    ~CLuaFn(void);
    
    void Init();    //初始化Lua对象指针参数
    void Close();    //关闭Lua对象指针
 
    bool LoadLuaFile(const char* pFileName);    //加载指定的Lua文件
    bool CallFileFn(const char* pFunctionName, int nParam1, int nParam2);        //执行指定Lua文件中的函数private:
    lua_State* m_pState;    //这个是Lua的State对象指针,你可以一个Lua文件对应一个
;

 

(3)C++程序(.cpp文件)

 

#include "CLuaFn.h"
 
CLuaFn::CLuaFn(void)m_pState = NULL;;        //这句干嘛
CLuaFn::~CLuaFn(void);
//初始化函数void CLuaFn::Init()

    if (NULL == m_pState)
    
        m_pState = lua_open();    //返回一个lua对象指针
        luaL_openlibs(m_pState);    //加载了所有你可能用到的Lua基本库    

//关闭Lua对象并释放资源void CLuaFn::Close()

    if(NULL != m_pState)
    
        lua_close(m_pState);
        m_pState = NULL;
    

bool CLuaFn::LoadLuaFile(const char* pFileName)

    int nRet = 0;
    if (NULL == m_pState)
    
        printf("[CLuaFn::LoadLuaFile]m_pState is NULL./n");
        return false;
    
    //加载文件的时候尽量放在程序的初始化中
    nRet = luaL_dofile(m_pState, pFileName);
    if (nRet != 0)
    
        printf("[CLuaFn::LoadLuaFile]luaL_loadfile(%s) is file(%d)(%s)./n", pFileName, nRet, lua_tostring(m_pState, -1));
        return false;
    
    return true;

bool CLuaFn::CallFileFn(const char* pFunctionName, int nParam1, int nParam2)

    int nRet = 0;
    if (NULL == m_pState)
    
        printf("[CLuaFn::CallFileFn]m_pState is NULL./n");
        return false;
    
    //验证你的Lua函数是否在你当前加载的Lua文件中,并把指针指向这个函数位置    lua_getglobal(m_pState, pFunctionName);
 
    // 压栈(顺序:从左到右的参数):第一个参数    lua_pushnumber(m_pState, nParam1);
    // 压栈:第二个参数    lua_pushnumber(m_pState, nParam2);
    //执行这个函数,2是输入参数的个数,1是返回值的个数
    nRet = lua_pcall(m_pState, 2, 1, 0);
    if (nRet != 0)
    
        printf("[CLuaFn::CallFileFn]call function(%s) error(%d)./n", pFunctionName, nRet);
        return false;
    
    if (lua_isnumber(m_pState, -1) == 1)
    
        int nSum = lua_tonumber(m_pState, -1);
        printf("[CLuaFn::CallFileFn]Sum = %d./n", nSum);
    
    return true;

 

(4)C++程序(main文件)

 

#include "CLuaFn.h"int main(int argc, char* argv[])

    CLuaFn LuaFn;
    LuaFn.Init();
    LuaFn.LoadLuaFile("Sample.lua");
    LuaFn.CallFileFn("func_Add", 11, 12);
    getchar();
 
    return 0;

 

注:程序中的注释已经很详尽,这里不在对代码进行解释。下载安装lua之后,在vs2010中还要引入相应的库。截图如下:

技术图片

技术图片

技术图片

 

以上是关于lua与c的交互(运用)的主要内容,如果未能解决你的问题,请参考以下文章

lua 与 c++或者c 交互的底层原理谁能解释一下?最最底层的,为啥它们调用C或者C++的函数?

Lua与C/C++交互

Lua与C/C++交互

Lua与C/C++交互

LuaJavaBridge - lua与java互操作的简单解决方案

搭建Lua与C/C++交互的环境