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

C++利用LuaIntf调用Lua

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

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 代码:

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

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

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

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

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

如何使用看他的README.md

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

main.cpp代码如下

#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代码如下:

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代码如下:

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完成打印

总结

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

(0)

相关推荐

  • 在Pycharm中设置默认自动换行的方法

    如下所示: 只对当前文件有效的操作: 菜单栏->View -> Active Editor -> Use Soft Wraps: 如果想对所有文件都有效,就要在setting里面进行操作: File-> Setting-> Editor-> General -> Use soft wraps in editor. 以上这篇在Pycharm中设置默认自动换行的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • 在Pycharm中修改文件默认打开方式的方法

    新下载了一个Pycharm,建了个小demo,期间产生了一个sqlite3文件,由于是第一次打开,就弹出选择打开方式的对话框,手一块直接点了个Text,然后就乱码了: 那我们不小心操作后,怎么重新修改文件的默认打开方式呢? 1.File -> Settings -> Editor -> File Types 找到Text下的"*.sqlite3",把它删掉就ok啦~ 以上这篇在Pycharm中修改文件默认打开方式的方法就是小编分享给大家的全部内容了,希望能给大家一个参

  • 配置 Pycharm 默认 Test runner 的图文教程

    如下所示: 由图中可见,当前使用的是 unittest 测试框架 修改方式如下: 以上这篇配置 Pycharm 默认 Test runner 的图文教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Pycharm设置界面全黑的方法

    win7 pycharm设置界面全黑色方法: 1.设置默认PyCharm解析器: 操作如下: Python–>Preferences–>Project Interpreter–>Python Interpreter 点击"+"号选择系统安装的Python. 然后再返回Project Interpreter,选择刚添加的解释器. 2.设置缩进符为制表符"Tab". File -> Default Settings -> Code Styl

  • pycharm重置设置,恢复默认设置的方法

    window 系统 找到下方目录-->删除. 再重新打开pycharm # Windows Vista, 7, 8, 10: <SYSTEM DRIVE>\Users\<USER ACCOUNT NAME>\.<PRODUCT><VERSION> 例:C:\Users\Administrator\.PyCharm2018.1 # Windows XP: <SYSTEM DRIVE>\Documents and Settings\<US

  • Pycharm 设置默认头的图文教程

    1. 设置的路径是File->settings->Editor->File and Code Templates->Python Script内容见图: 这样新建文件的时候就会默认头如下: 这里说明下#!/usr/bin/evn python 和 #!/usr/bin/python的区别: 第一种写法是在PC的Path中找寻第一个python 用来执行你所编写的脚本信息. 第二种写法是把地址写死,这样可能导致找不到可以执行脚本的python就会报错. 以上这篇Pycharm 设置默

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

    C++利用LuaIntf调用Lua 本文主要介绍了C++利用LuaIntf调用Lua的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. void LuaTest::OnResponse(uint32_t uLuaRpcId, const std::string& sRespContent) const { using LuaIntf::LuaRef; LuaRef require(m_pLuaState, "require"); try { LuaRe

  • python利用拉链法实现字典方法示例

    前言 字典也叫散列表,最大的特点是通过key来查找其对应的值其时间复杂度是O(1),下面这篇文章就来给大家介绍介绍python利用拉链法实现字典的方法. 在Python中怎样用列表实现字典? 用列表实现字典最大的问题就是解决hash冲突,如果在列表中通过计算不同的key得到相同的相同了位置,这时候应该怎么办? 最简单的办法就是使用拉链法. 拉链法:就是在一个列表中每个位置再添加一个列表,这样就算是有hash冲突也能够存储进去,当选取的hash函数足够好, num的数足够大,就能够保证列表中的每一

  • Python利用BeautifulSoup解析Html的方法示例

    介绍 Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等功能.它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序. Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码.你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了.然后,你仅仅需要说明一下原始编码方式就可以了. Beautiful

  • Android开发调用WebService的方法示例

    本文实例讲述了Android开发调用WebService的方法.分享给大家供大家参考,具体如下: WebService是一种基于SOAP协议的远程调用标准,通过webservice可以将不同操作系统平台.不同语言.不同技术整合到一块.在Android SDK中并没有提供调用WebService的库,因此,需要使用第三方的SDK来调用WebService.PC版本的WEbservice客户端库非常丰富,例如Axis2,CXF等,但这些开发包对于Android系统过于庞大,也未必很容易移植到Andr

  • Python中用字符串调用函数或方法示例代码

    前言 本文主要给大家介绍了关于Python用字符串调用函数或方法的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 先看一个例子: >>> def foo(): print "foo" >>> def bar(): print "bar" >>> func_list = ["foo","bar"] >>> for func in func_li

  • 利用PHP_XLSXWriter代替PHPExcel的方法示例

    前言 本文主要给大家介绍的是关于利用PHP_XLSXWriter代替PHPExcel的方法,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍: 二者有何区别? PHPExcel 是一个处理Excel,CVS文件的开源框架,它基于微软的OpenXML标准和PHP语言.可以使用它来读取.写入不同格式的电子表格,这也是PHP至今最通用的Excel处理工具,但是它有一个非常致命的缺点: 特别占内存,对大批量的表格数据几乎会让人累觉不爱,处理速度非常慢,但是它功能非常丰富,API非常多,所以在导

  • Python3.5 + sklearn利用SVM自动识别字母验证码方法示例

    前言 最近正在研究人工智能,为了加深对算法的理解,决定写个自动设别验证码的程序.看了看网上的demo,大部分都是python2的写法,而且验证码的识别都是用的数字做例子,那我就写个基于python3字母识别的程序,不过一路写下来碰到不少坑,大家感兴趣的话可以慢慢看. 图片识别有几个比较大的步骤是必须完成的: 1.有大量的验证码图片作为样本 2.图片要进行处理  流程是:灰度化==>二值化==>字符切割==>识别分类 3.图像识别要提取特征值,然后把图片二值化的数据当做样本做训练,最后基于

  • Lua教程(三):C语言、C++中调用Lua的Table示例

    从写上一篇Lua的文章到现在,已经过去半月有余了,是时候让自己的Lua状态refresh一下了.本教程将介绍Lua的栈及基本栈操作,同时还有如何在C/C++代码里面读取Lua的Table. 理解Lua栈 Lua通过一个"虚拟栈"与C/C++程序进行数据交互,所有的Lua C API都是通过操作这个栈来完成相应的数据通信. Lua的这个"虚拟栈"解决了C/C++程序与Lua程序通信的两大问题: 1.Lua使用垃圾回收,而C/C++需要手动管理内存. 2.Lua使用动态

  • python3利用Socket实现通信的方法示例

    参考于: python cs架构实现简单文件传输 原文中程序运行有误,在此做修改与解释,如下: 功能说明: 共2个py文件分别为server和client端,采用socket进行通信.提供两种功能:"dir" 命令用于显示服务器端可下载文件名:"get/put+文件名" 命令用于与服务器端进行下载或发送数据交换. Socket解释 服务器上socket编写步骤: 1.调用socket函数创建socket对象,如: socket_server = socket.soc

  • egg.js的基本使用和调用数据库的方法示例

    首先,整个项目的创建命令: npm i egg-init -g //安装egg egg-init egg-example --type=simple //初始化一个egg模板例子 后面的type跟的是模板类型这里是简单的 cd egg-example//进入例子 npm i //安装依赖 可以去官方教程查看基本配置的讲解. 直接说使用,简单看过Egg的文档,官方文档对于入门还是很实用的,再配合一些别人的攻略很容易入门上手就可以使用. 首先router.js: 'use strict'; /**

随机推荐