当前位置: 首页 > news >正文

xlua扩展第三方库记录

xlua扩展第三方库记录

https://blog.csdn.net/zhaixh_89/article/details/83538557

随着xlua的开源,其在项目中的使用也越来越广泛。游戏开发中我们经常会使用第三方库如,json解析,网络协议等等,目前xlua目前内置的扩展库:

1、针对luajit的64位整数支持;
2、函数调用耗时以及内存泄漏定位工具;
3、用于支持ZeroBraneStudio的luasocket库;
4、tdr 4 lua;

随着使用项目的增加以及项目使用的深入程度,仅有这几个扩展已经没法满足项目组了,而由于各个项目对扩展差异化比较大,以及手机平台对安装包大小的敏感,XLua是无法通过预集成去满足这些需求,结合官网的例程记录下自己扩展的步骤以及遇到的错误
我的环境大概如下:

windows操作系统,
xlua最新源码(版本105),
vs2015,cmake(3.13),
第三方扩展源码(提前下载好rapidjson)
步骤

1、安装cmake(根据自己电脑配置选择合适的版本)
cmake安装之后最好重启下电脑,即便环境变量已经配置好,但是有时还是会不识别
根据例子修改CMakeLists.txt文件,接入扩展
把xLua的C源码包解压到你Unity工程的Assets同级目录下。

2、在CMakeLists.txt加入扩展

下载lua-rapidjson代码,按你的习惯放置。本教程是把rapidjson头文件放到$UnityProj\build\lua-rapidjson\include目录下,
而扩展的源码rapidjson.cpp放到$UnityProj\build\lua-rapidjson\source目录下(注:$UnityProj指的是你工程的目录)
xLua的各平台Plugins编译使用cmake编译,好处是所有平台的编译都写在一个makefile,大部分编译处理逻辑是跨平台的。
xLua配套的CMakeLists.txt为第三方扩展提供了扩展点(都是list):
THIRDPART_INC:第三方扩展的头文件搜索路径。
THIRDPART_SRC:第三方扩展的源代码。
THIRDPART_LIB:第三方扩展依赖的库。
如下是rapidjson的加

    #begin lua-rapidjson
    set (RAPIDJSON_SRC lua-rapidjson/source/rapidjson.cpp)
    set_property(
        SOURCE ${RAPIDJSON_SRC}
        APPEND
        PROPERTY COMPILE_DEFINITIONS
        LUA_LIB
    )
    list(APPEND THIRDPART_INC  lua-rapidjson/include)
    set (THIRDPART_SRC ${THIRDPART_SRC} ${RAPIDJSON_SRC})
    #end lua-rapidjson

3、修改执行bat文件

比如windows 64位lua53版本是make_win64_lua53.bat,android的luajit版本是make_android_luajit.sh,要编译哪个版本就执行相应的脚本即可。
执行完编译脚本会自动拷贝到plugin_lua53或者plugin_luajit目录,前者是lua53版本放置路径,后者是luajit。
配套的android脚本是在linux下使用的,脚本开头的NDK路径要根据实际情况修改。双击执行结果如下图:

然后把生成的plugin_lua53/Plugins/x86_64/xlua.dll 直接覆盖unity项目的Assets/Plugins/x86_64/xlua.dll

4、c#集成
所有lua的C扩展库都会提供个luaopen_xxx的函数,xxx是动态库的名字,比如lua-rapidjson库该函数是luaopen_rapidjson,这类函数由lua虚拟机在加载动态库时自动调用,而在手机平台,由于ios的限制我们加载不了动态库,而是直接编译进进程里头。
为此,XLua提供了一个API来替代这功能(LuaEnv的成员方法):
public void AddBuildin(string name, LuaCSFunction initer)
name:buildin模块的名字,require时输入的参数;
initer:初始化函数,原型是这样的public delegate int lua_CSFunction(IntPtr L),必须是静态函数,而且带MonoPInvokeCallbackAttribute属性修饰,这个api会检查这两个条件。
我们以luaopen_rapidjson的调用来看看怎么使用。
扩展LuaDLL.Lua类,用pinvoke把luaopen_rapidjson导出到C#,然后写一个符合lua_CSFunction定义的静态函数,你可以在里头做写初始化工作,比如luaopen_rapidjson的调用,以下是完整代码:

    namespace LuaDLL
    {
        public partial class Lua
        {
            [DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]
            public static extern int luaopen_rapidjson(System.IntPtr L);
     
            [MonoPInvokeCallback(typeof(LuaDLL.lua_CSFunction))]
            public static int LoadRapidJson(System.IntPtr L)
            {
                return luaopen_rapidjson(L);
            }
    }
    }

然后在lua虚拟机创建时调用AddBuildin:
luaenv.AddBuildin("rapidjson", LuaDLL.Lua.LoadRapidJson);

例子测试代码

    local rapidjson = require('rapidjson')
    local t = rapidjson.decode('{"a":123}')
    print(t.a)
    t.a = 456
    local s = rapidjson.encode(t)
    print('json', s)

当以上步骤都完成时重启unity报错了,报错信息如下:

这是因为我下载的xlua版本是104的,生成的xlua.dll是105版本的,去官网下载最新的xlua源码替换下就好了
————————————————
版权声明:本文为CSDN博主「zhaixh_89」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhaixh_89/article/details/83538557

 

 

 

 

 

 

相关文章:

  • XLua-操作与使用
  • 如何优雅使用Sublime Text3(Sublime设置豆沙绿背景色和自定义主题)
  • Unity 无缘无故提示缺少类型解决方法
  • Eclipse 最底下有垃圾回收按钮
  • activity堆栈式管理
  • XLUA学习笔记之C#和Lua之间的相互调用
  • Lua 元表(Metatable)
  • XLua Lua访问C#中的方法(四)访问枚举
  • Unity中Shader和AssetBundle结合使用的注意事项
  • 解决打包AssetBundle时Shader(材质)丢失问题
  • hader in AssetBundle
  • 八:Unity ShaderLab内存优化
  • Unity5 多场景 打包Assetbundle 以及 Shader Stripping 导致 LightMap 全部丢失的解决方法
  • Unity Shader优化
  • 使用ZeroBrane Studio进行LUA远程调试
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 30天自制操作系统-2
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • Java精华积累:初学者都应该搞懂的问题
  • Java深入 - 深入理解Java集合
  • PHP的类修饰符与访问修饰符
  • quasar-framework cnodejs社区
  • Spring Boot快速入门(一):Hello Spring Boot
  • spring boot下thymeleaf全局静态变量配置
  • unity如何实现一个固定宽度的orthagraphic相机
  • vue数据传递--我有特殊的实现技巧
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 手机端车牌号码键盘的vue组件
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 一道闭包题引发的思考
  • 找一份好的前端工作,起点很重要
  • Java总结 - String - 这篇请使劲喷我
  • zabbix3.2监控linux磁盘IO
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • # Apache SeaTunnel 究竟是什么?
  • #pragma pack(1)
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • $refs 、$nextTic、动态组件、name的使用
  • (11)MATLAB PCA+SVM 人脸识别
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (zt)最盛行的警世狂言(爆笑)
  • (差分)胡桃爱原石
  • (二)换源+apt-get基础配置+搜狗拼音
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (过滤器)Filter和(监听器)listener
  • (蓝桥杯每日一题)love
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (算法)Travel Information Center
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • .Net Winform开发笔记(一)
  • .NET 依赖注入和配置系统