前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Slua集成第三方库(一)

Slua集成第三方库(一)

作者头像
bering
发布2020-04-01 21:15:44
1.3K0
发布2020-04-01 21:15:44
举报
文章被收录于专栏:游戏开发之旅游戏开发之旅

材料

Slua1.6.2:https://github.com/pangweiwei/slua/releases/tag/1.6.2

环境

window10_64bit

开始

Slua1.6.2解压之后的文件夹内容如图:

在这里插入图片描述
在这里插入图片描述

Assets文件夹存放我们build之后的Slua文件,这个文件夹下的内容要拷贝到Unity的Assets中供Unity编译调用,其中内容如图

在这里插入图片描述
在这里插入图片描述

设置编译环境

Slua的编译主要在文件夹build中进行,build文件夹内容如图

在这里插入图片描述
在这里插入图片描述
  • 首先我们要把集成的三方文件统一放到一个文件夹下,方便管理,这里在build文件夹下新建一个文件夹3rd用来存放需要集成的第三方源文件
  • 3rd文件夹下新建一个C语言的头文件命名为“all3rd.h”,用来统一管理注册该文件夹下所有的源文件,再新建一个luatest.c源文件作为我们要扩展的第三方库,3rd文件夹下的文件都要作为lib注册到slua中(这一步后面讲),all3rd.h,luatest.c的代码分别如下所示:
代码语言:javascript
复制
#define COMPILE_3RD   //定义COMPILE_3RD,用来在slua.c中判定是否编译第三方源文件
#ifdef COMPILE_3RD

#ifndef SLUA_3RD_LOADED
#define SLUA_3RD_LOADED

#include "luatest.c" //要测试的第三方源文件

#define EXTEND_LUA_LIB_MAP(XX) XX(luatest,luaopen_luatest)  //这里执行XX

static int luaopen_all3rd(lua_State *L)
{
	int top=lua_gettop(L); //获得栈顶值
#define XX(libname,opnefunc) (opnefunc(L),lua_setglobal(L,#libname)) 
	 //这里XX的作用就是执行第三方库的开始方法
	//(执行luaopen_XXX函数)并将libname暴露给lua使用,lua_setglobal查看luaCAPI
	EXTEND_LUA_LIB_MAP(XX);
#undef XX
	lua_settop(L,top); //设置栈顶值
	return 0;
}
#endif //SLUA_3RD_LOADED
#endif //COMPILE_3RD
代码语言:javascript
复制
#include <stdio.h>
#include <string.h>
#if ((LUA_VERSION_NUM < 502) && (!defined(luaL_newlib)))//以防小于502版本的lua没有定义luaL_newlib
#  define luaL_newlib(L,l) (lua_newtable(L), luaL_register(L,NULL,l))
#endif

static int Test1(lua_State *L) //自定义方法Test1供lua调用,作用:链接两个字符串
{
	char *oneParam=luaL_checkstring(L,1); //检测并得到Slua中调用Test1的第一个参数
	char *twoParam=luaL_checkstring(L,2);//检测并得到Slua中调用Test1的第二个参数
	lua_pushfstring(L,"%s+%s",oneParam,twoParam);//返回值压入栈
	return 1;//返回值个数
}
static int Test2(lua_State *L)//自定义方法,作用:计算两数之和
{
	double param1=luaL_checknumber(L,1);//检测并得到Slua中调用Test2的第一个参数
	double param2=luaL_checknumber(L,2);//检测并得到Slua中调用Test2的第一个参数
	lua_pushnumber(L,param1+param2);//返回值压入栈
	return 1;//返回值个数
}

static const struct luaL_Reg mylibs[]=//要注册方法数组
{
	{"Test1",Test1},
	{"Test2",Test2},
	{NULL,NULL},
};

int luaopen_luatest(lua_State *L) //入口方法,编译时由这里进入
{
	luaL_newlib(L,mylibs);//注册
	return 1;
}
  • 之后我们需要修改图中标记的两个文件,slua.c源文件和make_win_x64.bat批处理 在slua.c文件中需要注册我们之前创建的all3rd.h(即注册我们的第三方库文件,以便在编译时把第三方库文件也编译进去),打开slua.c
在这里插入图片描述
在这里插入图片描述

在slua.c中添加头文件:#include “3rd/all3rd.h”

在这里插入图片描述
在这里插入图片描述

然后再找到 luaS_openextlibs方法,在这个方法中添加all3rd.h文件中的luaopen_all3rd方法,参数指针传入,添加如图标记的部分

在这里插入图片描述
在这里插入图片描述

至此,我们库文件的添加已经完成了

  • 编辑make_win_x64.bat 因为slua.c文件是在“luajit-2.1.0-beta3/src”文件加下进行编译的,luajit的编译流程是先使用VS环境中的vcvars64.bat编译,然后再执行luajit的批处理msvcbuild.bat对文件进行编译,有兴趣可以研究研究,总之,我们要做的就是把build下要编译进slua.c(包括slua.c)的库,复制到“luajit-2.1.0-beta3/src”文件夹下进行编译
在这里插入图片描述
在这里插入图片描述

这个复制过程可以写成批处理,这也是编辑make_win_x64.bat的原因,打开make_win_x64.bat添加如下内容,作用:在“luajit-2.1.0-beta3/src”文件夹下创建3rd文件夹,并将“build/3rd/”文件夹下的内容全部拷贝到“luajit-2.1.0-beta3/src/3rd/”文件夹下

代码语言:javascript
复制
md %LUAJIT_PATH%\src\3rd
xcopy 3rd %LUAJIT_PATH%\src\3rd /s /h /d /y

做完以上步骤,双击执行make_win_x64.bat批处理,将Assets文件夹下的内容拷贝到Unity中

在这里插入图片描述
在这里插入图片描述
测试

Slua的lua文件中引入luatest

在这里插入图片描述
在这里插入图片描述

测试luatest中的自定义方法Test1,Test2

在这里插入图片描述
在这里插入图片描述

结果如图

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 材料
  • 环境
  • 开始
    • 设置编译环境
      • 测试
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档