1,配置msys2
在这里下载msys2
下载安装完成msys2之后,我们还需要安装一些库,可以使用msys2自带的软件包管理工具pacman来安装。
安装前,需要配置下pacman的源(国内的源相比国外的下载速度更快些),我参考了这里
打开c:\msys64\mingw32_shell.bat,输入以下命令
#update the package database and pacman pacman -Sy pacman #install autoconf, automake, libtool, gcc, perl, zip, pkg-config pacman -S autoconf automake libtool gcc perl zip pkg-config
到这一步,msys2环境就配置完了。
2,下载mono源码
在这里下载unity mono源码,这里需要注意不必下载master分支的源码,而是与你的unity3d版本对应的分支的代码,例如我使用的是unity3d 4.7,我没找到4.7的分支代码,所以就下载了4.6分支的代码。
我下载的mono源码是unity-mono-4.6。
3,下载并编译krait_signal_handler
在这里下载krait_signal_handler。
以unity-mono-4.6为例,将unity-mono-4.6放在D盘,将krait_signal_handler改名为android_krait_signal_handler,放在D:\mono-unity-4.6\external目录里。
修改android_krait_signal_handler/build.pl的第10行代码
#!/usr/bin/perl -w use PrepareAndroidSDK; use File::Path; use strict; use warnings; sub BuildAndroid { PrepareAndroidSDK::GetAndroidSDK(undef, undef, "r9d"); #注意这里,改成你自己的ndk版本 system('$ANDROID_NDK_ROOT/ndk-build clean'); system('$ANDROID_NDK_ROOT/ndk-build'); }
修改android_krait_signal_handler/PrepareAndroidSDK.pm:
sub GetAndroidSDK { if(lc $^O eq 'darwin') { $HOST_ENV = "macosx"; $TMP = $ENV{"TMPDIR"}; $HOME = $ENV{"HOME"}; } elsif(lc $^O eq 'linux') { $HOST_ENV = "linux"; $TMP = "/tmp"; $HOME = $ENV{"HOME"}; } elsif(lc $^O eq 'mswin32') { $HOST_ENV = "windows"; $TMP = $ENV{"TMP"}; $HOME = $ENV{"USERPROFILE"}; if (-e "Tools/WinUtils/7z/7z.exe") { $WINZIP = "Tools/WinUtils/7z/7z.exe"; } } elsif(lc $^O eq 'cygwin') { $HOST_ENV = "windows"; $TMP = $ENV{"TMP"}; $HOME = $ENV{"HOME"}; } elsif(lc $^O eq 'msys') { $HOST_ENV = "windows"; $TMP = $ENV{"TMP"}; $HOME = $ENV{"HOME"}; } else { die "UNKNOWN " . $^O; }
最后,打开msys,
cd /d/unity-mono-4.6/external perl build.pl
当然如果你看到krait_signal_handler里面有builds.zip,这是别人编译好的库,你可以将它解压缩放在合适的位置(需要参照build_runtime_android.sh里面链接的位置)。
4,编译mono源码
更改mono-unity-4.6/external/buildscripts/build_runtime_android.sh
#添加android ndk路径配置 export ANDROID_NDK_ROOT=/d/android-ndk-r10e export ANDROID_PLATFORM=android-9 GCC_PREFIX=arm-linux-androideabi- GCC_VERSION=4.8 OUTDIR=builds/embedruntimes/android CWD="$(pwd)" PREFIX="$CWD/builds/android" BUILDSCRIPTSDIR=external/buildscripts #注意ndk版本 perl ${BUILDSCRIPTSDIR}/PrepareAndroidSDK.pl -ndk=r10e -env=envsetup.sh && source envsetup.sh
打开msys2,进入mono-unity-4.6目录,开始编译
cd /d/mono-unity-4.6 ./external/buildscripts/build_runtime_android.sh
5,问题总汇
'ucontext_t' undeclared:
android ndk版本太旧,更换为android ndk r10e
configure: error: C compiler cannot create executables:
我这里是因为krait_signal_handler这个库没编译,需要先编译下