服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++利用LuaIntf调用Lua的方法示例

C++利用LuaIntf调用Lua的方法示例

2021-06-09 15:07金庆 C/C++

这篇文章主要给大家介绍了关于C++利用LuaIntf调用Lua以及利用lua-intf来调用C++函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一的参考学习价值,需要的朋友们下面来一起看看吧。

C++利用LuaIntf调用Lua

本文主要介绍了C++利用LuaIntf调用Lua的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void LuaTest::OnResponse(uint32_t uLuaRpcId,
 const std::string& sRespContent) const
{
 using LuaIntf::LuaRef;
 LuaRef require(m_pLuaState, "require");
 try {
  LuaRef handler = require.call<LuaRef>("client_rpc_response_handler");
  handler.dispatchStatic("handle", uLuaRpcId, sRespContent);
 }
 catch (const LuaIntf::LuaException& e) {
  std::cerr << "Failed to call lua client_rpc_response_handler.handle(), "
   << e.what() << std::endl;
 }
}

这是测试客户端代码,可以写Lua代码测试服务器.

Lua代码中发出一个Rpc请求时, 会在Lua中保存一个回调, 待收到应答时触发回调. 通过uLuaRpcId来索引该回调.

sRespContent 是收到的应答包, 将在lua中解包.

OnResponse() 就是调用了 Lua 代码:

?
1
require("client_rpc_response_handler").handle(uLuaRpcId, sRespContent)

利用lua-intf来调用C++函数

这里主要是在windows利用VS2015完成,首先是配置lua环境,包含lua的头文件,连接器里面链接lua的静态库,然后就是包含lua-intf的代码,具体如下表

C++利用LuaIntf调用Lua的方法示例

需要注意的是:lua-intf_d6f17a是一个包含lua-intf的目录。

lua-intf的代码在github上可以下载:https://github.com/SteveKChiu/lua-intf

如何使用看他的README.md

这里我们主要是测试绑定C++类中的函数,工程目录结构如下

main.cpp代码如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <iostream>
#include <lua.hpp>
#include <LuaIntf/LuaIntf.h>
#include <string>
 
const char SCRIPTS_DIR[] = "../scripts";
 
using namespace std;
 
struct lua_State;
 
class TestLog
{
public:
 static TestLog *getInstance()
 {
  static TestLog instance;
  return &instance;
 }
 
 ~TestLog();
 void Log(const string &str);
 void BindLua(lua_State *l);
 
private:
 TestLog();
  
};
 
TestLog::TestLog()
{
}
 
TestLog::~TestLog()
{
}
 
void TestLog::Log(const string &str)
{
 cout << str << endl;
}
 
namespace
{
 using LuaRef = LuaIntf::LuaRef;
 
 void LuaLog(const string &str)
 {
  TestLog::getInstance()->Log(str);
 }
 
 namespace LuaTestLog
 {
  void Bind(lua_State* L)
  {
   assert(L);
   LuaIntf::LuaBinding(L).beginModule("c_testlog")
    .addFunction("log", &LuaLog)
    .endModule();
  }
 };
};
 
void TestLog::BindLua(lua_State *l)
{
 LuaTestLog::Bind(l);
}
 
int main()
{
 lua_State *l = luaL_newstate();
 luaL_openlibs(l);
 TestLog::getInstance()->BindLua(l);
 cout << "mmmmmmmmmmm" << endl;
 luaL_dofile(l, "test.lua");
 system("pause");
 return 0;
}

log.lua代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
local Log = {}
 
local log = c_testlog.log
 
function Log:new(log_name)
 assert("table" == type(self))
 assert(not log_name or "string" == type(log_name))
 local log = {}
 log.log_name = log_name or "Log"
 setmetatable(log, self)
 self.__index = self
 return log
end
 
function Log:set_log_name(log_name)
 self.log_name = log_name
end
 
function Log:info(pattern, ...)
 log(string.format(pattern, ...))
end
 
function Log:debug()
 print("ssssssssssssssssssssssssss")
end
 
return Log

test.lua代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
local function main()
 
 print("dddddddddddddddddddddddd")
 local p = "../testLuaIntf"
 package.path = package.path ..";" .. p .. "/" .. "testLuaIntf" .. "/?.lua"
 --package.path = package.path .. "E:\VSProject\?.luac"
 
 print("bbbbbbbbbbbbbbbbbbbbbbbbbbbbb")
 
 local log = require("log"):new("svn_log")
 log:info("%d...",1)
 
 
 --:new("svc_log")
 print("ssssssssssssssssssssssss")
 
 
end
 
 
xpcall(main,function(...)
local msg = {...};
for k ,v in pairs(msg) do
print("k=" .. tostring( k) .. " v=" .. tostring(v))
 
end
print(tostring() .. " 123")
end)

这里流程通过C++调lua的接口luaL_dofile(l, "test.lua");来执行test.lua,test.lua中require("log"),然后lua再调用C++的函数Log完成打印

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。

原文链接:http://blog.csdn.net/jq0123/article/details/53545004

延伸 · 阅读

精彩推荐
  • C/C++深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下...

    C++教程网5182020-11-30
  • C/C++C语言main函数的三种形式实例详解

    C语言main函数的三种形式实例详解

    这篇文章主要介绍了 C语言main函数的三种形式实例详解的相关资料,需要的朋友可以参考下...

    ieearth6912021-05-16
  • C/C++C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    两片空白7312021-11-12
  • C/C++c/c++内存分配大小实例讲解

    c/c++内存分配大小实例讲解

    在本篇文章里小编给大家整理了一篇关于c/c++内存分配大小实例讲解内容,有需要的朋友们可以跟着学习参考下。...

    jihite5172022-02-22
  • C/C++c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址

    本文给大家汇总介绍了使用c/c++实现获取域名的IP地址的几种方法以及这些方法的核心函数gethostbyname的详细用法,非常的实用,有需要的小伙伴可以参考下...

    C++教程网10262021-03-16
  • C/C++OpenCV实现拼接图像的简单方法

    OpenCV实现拼接图像的简单方法

    这篇文章主要为大家详细介绍了OpenCV实现拼接图像的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    iteye_183805102021-07-29
  • C/C++使用C++制作简单的web服务器(续)

    使用C++制作简单的web服务器(续)

    本文承接上文《使用C++制作简单的web服务器》,把web服务器做的功能稍微强大些,主要增加的功能是从文件中读取网页并返回给客户端,而不是把网页代码...

    C++教程网5492021-02-22
  • C/C++关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    Struggler095962021-07-12