Windows 下使用 mingw+msys 交叉编译 Android Unity Mono
对于没有升级到 Unity5.4的用户,发布安卓版本都会有对 C# 脚本进行加密的需求,我们项目在裸奔了很长时间后,决定开始做这件事。
网上查看了很多资料,我很希望直接在 windows 下编译而不去安装虚拟机在 linux 或者在 mac 下安装,大概预计猜测就是 Cygwin, MinGW, MSYS 之类。最终 这篇博客 给我了很大的帮助,最终在继续踩坑和摸索下,完成了编译。
这里只总结下编译的过程,这里是重点,至于加密方法很多,各自选择吧,不在此赘述。
- 下载 Unity-mono 源码
- 我们使用的 5.3,经过查看官方的 Release Note,发布时间,以及 Unity-Mono 的 Commit 日志,发现 Unity Mono 5.3 分支的最后一次提交与 Unity5.3.7p4 保持一致。
- 准备编译环境:MinGW + MSYS
- 下载 MinGW-w64 并安装。(注:原生 MinGW 已经很久不维护,而 MinGW-w64 则一致更新很快,且工具集很全。但是:原生的 MingW 也可以下载和安装,有很多人抱怨自带的下载安装程序下载很慢,如果选择了的这个,为了节省时间,建议直接勾选所有的选项全部下载,否则自己不明白用途到了后期编译会不断出现缺少工具的问题。)
- 下载安装 MSYS,这个只能通过下载原生的 MinGW 安装程序,然后只选择安装 MSYS,而不安装 MinGW。如果不使用 MinGW-w64 那么直接按照上一条所说,下载安装 MinGW 的全部内容即可,如果缺少任何工具,前往 https://sourceforge.net/projects/mingw/files/MSYS/ 自行下载即可,直接覆盖到 msys/1.0/ 下。
- 以上所有安装路径最好不要出现空格。(或者理解为绝对不要出现空格)
- 当你第一次通过安装 MinGW 安装 MSYS 时,安装程序会自动配置 MSYS 需要的 MinGW 所在路径,在 msys/1.0/etc/fstab 文件中:
# Win32_Path Mount_Point
#--------------- -----------
D:/mingw /mingw将 Win32_Path 下的 MinGW 安装路径替换为你本地的 MinGW 安装路径即可。如果不修改到编译最后会因环境变量的问题出错,出现形如:Can't exec "cpp": No such file or directory at ./genmdesc.pl line 53. 的错误,这是 cpp 这个环境变量定义的编译器文件路径最终没有找到可执行文件。
- 为了方便编译,我整理好了一个 MinGW-W64+MSYS 的环境包,点击下载。下载解压后,记住需要修改 mingw-w64/x64/posix-seh/mingw64/msys/1.0/etc/fstab 中 mingw-w64 路径为:$(InstallDir)/mingw-w64/x64/posix-seh/mingw64,$(InstallDir) 为你安装的根目录,不要直接 copy。修改完毕双击 $(InstallDir)/mingw-w64/x64/posix-seh/mingw64/msys/1.0/msys.bat 即可开始使用编译环境。注:旁边的 "MSYS" 和 "MSYS-norxvt" 两个文件是指向 msys.bat 的快捷方式。
- 由于后面编译 Mono 需要一个 Zip 解压程序,以上安装包均不包含,自行前往 https://sourceforge.net/projects/mingw/files/MSYS/Extension/zip/zip-3.0-1/ 进行 下载,然后解压缩直接覆盖到 $(InstallDir)/mingw-w64/x64/posix-seh/mingw64/msys/1.0/ 即可。
- 下载 NDK r10e
- 下载 Zip
- 整个编译过程会用到 zip 命令,而默认的 MinGW+MSYS 环境中没有,可以在这里下载,然后解压缩覆盖到到 $(InstallDir)/mingw-w64/x64/posix-seh/mingw64/msys/1.0/ 下。
- 修改 Mono 编译脚本,位于 Mono 源码目录下 external/buildscripts/:
- 修改文件 build_runtime_android.sh,在文件脚本最最开始处(line:6)添加 "export ANDROID_NDK_ROOT=/$(NdkRoot)",$(NdkRoot) 为你本地的 Ardroid NDK 安装根目录。
- 修改文件 build_runtime_android.sh,将 KRAIT_PATCH_PATH="${CWD}/../../android_krait_signal_handler/build" 修改为:KRAIT_PATCH_PATH="${CWD}/android_krait_signal_handler/build"。(这个项目在编译时会动态 clone,应该被 clone 到源码根目录,如果不修改会 clone 到源码的上两级目录)。
- 修改文件 build_runtime_android.sh,将 -fpic -g -funwind-tables \ 修改为 -fpic -O2 -funwind-tables \ 以便编译为 release 版本。
- 修改文件 build_runtime_android.sh,只保留 armv7的编译,注释掉 armv5, armv6,形如:#clean_build "$CCFLAGS_ARMv5_CPU" "$LDFLAGS_ARMv5" "$OUTDIR/armv5",#clean_build "$CCFLAGS_ARMv6_VFP" "$LDFLAGS_ARMv5" "$OUTDIR/armv6_vfp"。
- 修改文件 build_runtime_android_x86.sh,将 -fpic -g \ 修改为 -fpic -O2 \ 。
- 修改文件 PrepareAndroidSDK.pm,将 elsif(lc $^O eq 'cygwin') 修改为:elsif(lc $^O eq 'cygwin' or lc $^O eq 'msys')。
- 修改 android_krait_signal_handler 编译脚本
- 如果已经启动过第一次编译并且失败或者主动 clone 过 android_krait_signal_handler 项目并存放于 Mono 源码根目录下,则修改其编译脚本。
- 修改 $(CloneDir)/PrepareAndroidSDK.pm,将 elsif(lc $^O eq 'cygwin') 修改为:elsif(lc $^O eq 'cygwin' or lc $^O eq 'msys'),$(CloneDir)为该项目的 clone 本地目录。
- 开始尝试编译
- 开始编译,启动 MSYS 命令行,切换到 Mono 源码根目录,运行 ./external/buildscripts/build_runtime_android.sh,启动编译.
- 如果未处理过 android_krait_signal_handler,那么编译脚本会先 clone 此项目,并且失败,如果启动了 clone 并且失败,那么请参照上一条 “修改 android_krait_signal_handler 编译脚本” 进行修改后重新编译。
- 等待命令行的各种检查,编译,输出,最后成功,会同时编译 armv7 和 x86 两个结果,分别在目录:$(MonoSrcDir)/builds/embedruntimes/android/ 下的 armv7a 和 x86 两个目录,文件为:libmono.so。
至此,按照以上的步骤,所有的编译过程会顺利完成。其中一些步骤都是经过反复实验出错修改最后发现的,并不是一帆风顺。如果新手第一次编译建议严格按照以上步骤进行,等编译顺利通过后再自行修改参数进行自定义。如果按照以上步骤却编译失败,那么以上记录可能有遗漏的地方,请告知。
Have Fun! :)
【参考引用】
Windows 下使用 mingw+msys 交叉编译 Android Unity Mono的更多相关文章
- 开源项目:windows下使用MinGW+msys编译ffmpeg
本文参考了网络上的不少文章,但由于版本环境的问题参考文章并不能直接指导编译,本文吸收多方经验,并在自己多次编译实验的基础上写成,欢迎转载,请注名出处. FFmpeg是在Linux平台下开发的,但 ...
- windows 下使用 MinGW + msys 编译 ffmpeg
本文参考了网络上的不少文章,但由于版本环境的问题参考文章并不能直接指导编译,本文吸收多方经验,并在自己多次编译实验的基础上写成,欢迎转载,请注名出处. FFmpeg是在Linux平台下开发的,但 ...
- Windows下将ImageMagick移植到Android平台
Windows下将ImageMagick移植到Android平台 原文链接 http://www.pedant.cn/2014/06/18/imagemagick-ported-android/ I ...
- 手把手教你在Windows下使用MinGW编译libav(参考libx264的编入)
转自:http://www.th7.cn/Program/cp/201407/242762.shtml 手把手教你在Windows下使用MinGW编译libav libav是在Linux下使用纯c语言 ...
- 在Linux下使用MinGW静态交叉编译带有zlib的libcurl(包括交叉编译openssl,即--cross-compile-prefix=i686-w64-mingw32- mingw)
在Linux下使用MinGW静态交叉编译带有zlib的libcurl libcurl是一个跨平台的.易用的.强大的网络库.在大部分Linux发行版中都有编译好的二进制包可供使用,Mac系统更是将其作为 ...
- 在Windows下使用MinGW静态编译Assimp
使用MinGW静态编译Assimp 到了5月份了,没有写一篇日志,于是自己从知识库里面拿出一篇文章充数吧.这次将要解说怎样在Windows下使用MinGW静态编译Assimp. Assimp是眼下比較 ...
- windows下使用mingw和msvc静态编译Qt5.15.xx
windows下使用mingw和msvc静态编译Qt5.15.xx 下载并安装相关依赖软件 Python version 2.7 https://www.python.org/downloads/ ( ...
- windows 下使用 mingw编译器 调试时 无法跟进源码
windows 下使用 mingw编译器 调试时 无法跟进源码 最近在公司使用QT 开发,官方在线下载的 安装的QT mingw 都是没有debug版本的 由于没有debug版本动态库 所以你调试的时 ...
- windows下使用mingw和msys编译GOTOBLAS和OpenBLAS
在windows下利用msys编译openBLAS若遇到错误提示: gcc: CreateProcess : No such file or directory 问题原因参考:http://www.c ...
随机推荐
- Spring注解@Resource和@Autowired的区别
@Resource和@Autowired都是用来做bean的依赖注入的,两者都可以写在字段和setter方法上. java为我们提供了 javax.annotation.Resource这个注解. s ...
- UVA 580 Critical Mass
https://vjudge.net/problem/UVA-580 题意:一堆U和L,用n个排成一排,问至少有3个U放在一起的方案数 f[i] 表示 至少有3个U放在一起的方案数 g[i] 表示没有 ...
- 数学:Burnside引理与Pólya定理
这个计数定理在考虑对称的计数中非常有用 先给出这个定理的描述,虽然看不太懂: 在一个置换群G={a1,a2,a3……ak}中,把每个置换都写成不相交循环的乘积. 设C1(ak)是在置换ak的作用下不动 ...
- jQuery日历签到插件
插件比较简单,先来看DEMO吧,http://codepen.io/jonechen/pen/bZWdXq: CSS部分: *{margin:0;padding:0;font:14px/1.8 &qu ...
- 第八周 yukun 20155335
- SCU 1029 Humble Numbers (打表处理)
题目链接 题意:素因子中只有2 3 5 7的数称为谦逊的数,1也是谦逊的数,题目中已经给出了前20个谦逊的数.给定数字n,按格式输出第n个谦逊的数. 题解:打表即可,注意打表的技巧就行了. ps:这道 ...
- Remmarguts' Date(POJ2449+最短路+A*算法)
题目链接:http://poj.org/problem?id=2449 题目: 题意:求有向图两点间的k短路. 思路:最短路+A*算法 代码实现如下: #include <set> #in ...
- poj 2387 Til the Cows Come Home(dijkstra算法)
题目链接:http://poj.org/problem?id=2387 题目大意:起点一定是1,终点给出,然后求出1到所给点的最短路径. 注意的是先输入边,在输入的顶点数,不要弄反哦~~~ #incl ...
- Android跳转到拨打电话的页面
在Android6.0之后,拨打电话需要用户授予动态权限,项目中有此需求,有一种简单的方法,直接携带电话号码跳转到系统拨打电话的页面,很多应用也是这么做的,这样可以减轻工作量 代码如下: Androi ...
- Android中TextView设置字体
最近项目中出现把字体设置成宋体,微软雅黑,黑体,楷体等的需求; 度娘发现Android系统默认支持三种字体,分别为:“sans”, “serif”, “monospace",除此之外还可以使 ...