Windows平台下的XLua第三方库的扩展编译

官方编译好的XLua,所包含的库远远不足以支持游戏开发,那么就需要自己加入新的第三方库,编译出文件

暂时只编译Android与Windows平台,其他平台没有试过,后续补充

环境配置

Windows编译环境

安装Visual Studio 2019

这里通过Visual Studio 2019来进行编译,Unity一般会自带安装,没有的话,可以自行前往官网下载,需要注意的是,Visual Studio 2019需要安装C++相关环境,可以通过选中“使用C++的桌面开发”来快速安装所需环境

如果Visual Studio 2019已安装的话,可以通过应用Visual Studio Installer打开上述界面,点击修改安装C++环境

安装CMake

CMake是一个跨平台的编译工具,可以自行前往官网下载

下载安装完毕后,记得要加入环境变量

控制台打印“cmake”即可测试是否安装成功

Android编译环境

安装Android Studio

Android编译环境可以通过Android Studio来快速安装,直接前往官网下载

安装CMake

Android平台下编译所用的CMake与Windows平台所使用的不同,所以需要通过Android Studio重新安装

Android Studio安装完毕后,打开 主界面 - 菜单栏 - File - Settings 打开设置

如下图所示,Appearance & Behavior - Android SDK - SDK Tools,这里注意将右下角的Show Package Details打上勾,然后勾选列表中CMake下的3.6.4111459版本,点击Apply安装CMake

配置Android SDK

Android Studio安装完毕自带有SDK,存放在 C:\Users[用户名]\AppData\Local\Android\Sdk ,需要加入至环境变量ANDROID_SDK

配置Android NDK

目前最新的XLua代码用的NDK版本是android-ndk-r15c,如果后续NDK版本更换,可以通过前往NDK历史版本下载,具体怎么看XLua所用的NDK版本号,可以见XLua项目 - build - make_android_lua53.sh,如下图所示

下载到对应的NDK压缩包,直接解压至任意路径,这里建议与上方的SDK放置在一起

将NDK路径加入至环境变量ANDROID_NDK

XLua编译

下载项目

前往GitHub页面下载XLua项目,我们需要编译的是build文件夹

修改配置

Windows环境

这里只示例Win64_lua53的修改,其他同理

修改make_win32_lua53.bat文件中的Visual Studio相关字符串,这里需要根据具体的VS版本来确定,如图所示,应该填写“Visual Studio 16 2019”

Android环境

这里只示例Android_lua53的修改,其他同理

这里需要修改文件 ./cmake/android.windows.toolchain.cmake 文件,将其中的llvm路径对应NDK中的相关路径

编译

以上环境均安装成功,可以直接双击build文件夹中对应的bat文件,来快速编译项目,下面放上成功截图,可以对照查看是否成功

make_win_lua54.bat

make_android_lua53.bat

需要注意的是,每次编译,都需要将文件夹中所有build、plugin前缀的文件夹删除

扩展第三方库

此处以扩展第三方库lua-protobuf为例

编译库

下载库

在build文件夹下新建lua-protobuf文件夹,从git上拉取或下载库文件

编译库文件

XLua是通过CMake编译的,我们可以通过修改CMakeLists.txt文件来添加库,因为对C/C++的编译不太熟悉,这里只说操作步骤

CMakeLists.txt内,添加下述代码

格式:

#begin [库名]
set ([临时变量名]
[编译文件名1]
[编译文件名2]
)
set_property(
SOURCE ${[临时变量名]}
APPEND
PROPERTY COMPILE_DEFINITIONS
LUA_LIB
)
list(APPEND THIRDPART_INC [头文件目录])
set (THIRDPART_SRC ${THIRDPART_SRC} ${[临时变量名]})
#end [库名]

示例:

#begin lua-profobuf
set (LPB_SRC
lua-protobuf/pb.c
)
set_property(
SOURCE ${LPB_SRC}
APPEND
PROPERTY COMPILE_DEFINITIONS
LUA_LIB
)
list(APPEND THIRDPART_INC lua-protobuf)
set (THIRDPART_SRC ${THIRDPART_SRC} ${LPB_SRC})
#end lua-protobuf

通过bat文件编译库文件,成功后将plugin_*\Plugins内所有文件覆盖至Unity的Assets\Plugins文件夹

Unity引用

声明库

这里为了更好的区分管理扩展的第三方库,建议新建文件

LuaDLLExtend.cs

using System.Runtime.InteropServices;

namespace XLua.LuaDLL
{
    public partial class Lua
    {

        [DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]
        public static extern int luaopen_pb(System.IntPtr L);

        [MonoPInvokeCallback(typeof(LuaDLL.lua_CSFunction))]
        public static int LoadPB(System.IntPtr L)
        {
            return luaopen_pb(L);
        }
    }
}

上述的luaopen_pb对应着库文件里的函数名,不能随意更改,需要去库工程里查看,这里有个小技巧,所有此类函数前缀都是luaopen_,基于这个技巧,我们去库工程里查询,发现有多个库,通过github项目说明,可以知道,只需要用到pb库,也就是luaopen_pb函数

内置库

通过LuaEnv的AddBuildin函数可以完成第三方库的内置

这里为了方便测试,新建两个LuaEnv,测试内置库是否成功

var luaEnv1 = new XLua.LuaEnv();
luaEnv1.AddBuildin("pb", XLua.LuaDLL.Lua.LoadPB);
luaEnv1.DoString(@"
    print('---------luaEnv1---------');
    print(require('pb'))
");
var luaEnv2 = new XLua.LuaEnv();
luaEnv2.DoString(@"
    print('---------luaEnv2---------');
    print(require('pb'))
");

至此,扩展第三方库完毕