在上面一节,我们学习了c++和c#混合编程,主要是针对windows平台。接下来我们会讲下在其他平台c++库在Unity中使用的方法。unity可以使用的ios静态库(.a) android 静态库(.so) mac下的bundle库。上面的库导出以后,放在Unity Plugins目录下,Unity在编译包或者在编辑器里运行的时候会自动对应相应的库。
unity 使用 在 Plugins 目录最终层级结构如下图所示:
Android 生成so
Android平台下,c++代码生成.so库,我们这里主要是使用ndk的方法。 NDK 是在SDK前面又加上了“原生”二字,即Native Development Kit,因此又被Google称为NDK。 随着Android的蓬勃发展, CPU的架构也越来越多. 早期只支持ARMv5, 截至目前, 支持的架构已达三类七种: ARM(ARMv5,ARMv7 (从2010年起),ARMv8), x86(x86 (从2011年起),x86_64 (从2014年起)) ,MIPS(MIPS (从2012年起),MIPS64). 众多架构使用的指令集不尽相同, 与相应的ABI关联: armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips, mips64. 所以, NDK编译不同架构的库要选择不同的ABI。 不过Unity5之后,导出的包只会有ARMv7和x86两种架构了,我们在配置的时候,也就只需考虑这两种结构就可以了。 而大红大紫的《王者荣耀》就更过分了,我们解开他们的apk之后,发现他们只有arm-v7这一种so,说明不常用的x86手机已经被他们无情的抛弃了。
你可以到官网下载NDK, 下载完成之后需要设置一些环境变量:
创建Application.mk和Android.mk文件
Application.mk文件,可以用来配置编译平台相关内容,它用来指定我们需要基于哪些CPU架构的.so文件,当然你可以配置多个平台:
配置Android.mk文件,用来指定源码编译的配置信息,例如工作目录,编译模块的名称,参与编译的文件等,大致内容如下:
其中
LOCAL_MODULE表示模块名称
LOCAL_SRC_FILES表示需要参与编译的源文件
除了这两个,其他照搬即可
NDK-build
android ndk构建系统依赖于GUN make工具对模块进行构建,默认情况下,GUN make工具一次执行一条构建命令,等这一句执行完了以后再执行下一句,如果我们使用-j参数,GUN make就可以并行执行构建命令。
cd 到jni的上一级目录,使用命令ndk-build, 自动生成了,libs目录
不过 build 之前,最好 clean一下,保证环境的纯净。
Mac下生成Bundle
创建 mac支持的 c++库,我们新建一个 xcode 工程,选择 macOS一栏,选择 Bunlde 一侧. 如下图所示:
创建好之后,我们把 windows 中vs 里使用的 c++代码拖到 xcode 工程中,这里使用引用就可以了,没有必要 copy 一份新的到 xcode
设置好自己使用的Architecture,如果顺利的话,你就可以编译到bundle 库了
在 products 目录下右键*.bundle 在 Show in Finder ,将生成的 bundle 复制到 unity 项目 plugins 目录下,就大工告成了。
生成IOS .a静态库
创建 ios支持的 c++库,我们新建一个 xcode 工程,选择 iOS一栏,选择 .a 一侧. 注意,ios 我们这里使用的是静态库,而非像其他平台是动态链接库。如下图所示:
其他的操作跟 macos 相同。编译成功之后我们可以看到 products 目录多出了 gamecore.a
下面借助一段Shell脚本就可以导出和合并生成.a 并且 copy 到 Plugins目录下:
macos 和 ios 的库都是在xcode 中手动生成的,不符合我们自动化的流程,我们生成版本时,如果中间每次都是手动操作的话,也很容易出错。那有没有一套自动化的流程,既省时,又能保证版本质量呢,答案是肯定的。
cmake交差编译
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。这里使用的是CMake,官网地址为:https://cmake.org/
MAC默认是没有cmake指令的。要测试你的MAC是否已经装过cmake,可以这样做:打开Terminal,输入cmake –version,如果已经安装,则会显示具体的版本号;否则就是没安装或者没配置成功。
以 OSX平台为例,下面展示:
CMakeLists.txt:
生成 ios 静态库,还需要配置一个 toolchain文件,你可以在这里点击下载。然后使用如下命令,生成 ios 工程:
好了,到这里就结束了,拿到 xcode 工程,之后使用xcodebuild编译出库,所有的流程都是Shell 在后台帮我们完成了,我们需要做的就是喝咖啡等待最终的结果了。