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

时间:2022-03-05 23:34:49

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