Mono Android編譯步驟

本文簡要描述在Linux下進行交叉編譯Unity 2017.4版本的Android Mono庫(libmono.so文件).

編譯環(huán)境

編譯環(huán)境 centos7.2_CHS_64
GCC版本 4.8

Mono版本: Unity_2017.4
源碼地址: https://github.com/Unity-Technologies/mono/tree/unity-2017.4
源碼下載地址: git clone -b unity-2017.4 https://github.com/Unity-Technologies/mono.git

目錄說明: (具體的后續(xù)會說明)

  • /root/tmp/mono-android/mono_unity_2017_4/mono // mono源碼目錄
  • /root/tmp/mono-android/android_ndk/android-ndk-r10e // NDK r10e目錄
  • /root/tmp/mono-android/android_ndk/android-ndk-r13b // NDK r13b目錄
  • /root/tmp/mono-android/android_krait_signal_handler // krait_signal_handler庫目錄

編譯Android mono

在mono根目錄運行:

/external/buildscripts/build_runtime_android.sh

在運行之前, 需要設(shè)置一下NDK.

設(shè)置Android NDK

首先需要說明的是, 在mono的編譯腳本里是有自動下載NDK的功能, 由 /external/buildscripts/PrepareAndroidSDK.pm 實現(xiàn)下載不同NDK版本的功能, 但是該腳本經(jīng)常會出現(xiàn)重復下載的問題, 所以這里是將自動下載的功能給注釋掉了, 自己去Android官網(wǎng)下載NDK, 然后將路徑定義到環(huán)境變量里.

但在下載NDK之前, 我們必須去知道這個版本的mono需要的ndk版本是多少, 判斷的辦法有兩種:

  1. 直接運行build_runtime_android.sh腳本, 讓它去嘗試下載, 打印日志里會打印出來它去下載的url地址和ndk版本號
  2. 查看build_runtime_android.sh腳本里, 直接看ndk的版本號, 自己去官網(wǎng)下載對應的ndk版本即可.

例如在build_runtime_android.sh腳本的最前面, 查看ndk版本后, 將這一行注釋掉, 則不會去自動下載ndk:

#perl ${BUILDSCRIPTSDIR}/PrepareAndroidSDK.pl -ndk=r10e -env=envsetup.sh && source envsetup.sh

可以看到這里需要的ndk版本是 r10e

這里我們?nèi)ndroid官網(wǎng)下去下載ndk版本即可.

Android NDK版本: r10e
NDK下載地址: https://dl.google.com/android/repository/android-ndk-r10e-linux-x86.zip
注意這里不需要64位的版本(但Android官網(wǎng)頁面上只有64位的版本下載)

然后將下載的ndk解壓到某個目錄, 設(shè)置ANDROID_NDK_ROOT環(huán)境變量

export ANDROID_NDK_ROOT=/root/tmp/mono-android/android_ndk/android-ndk-r10e

單獨手動編譯 android_krait_signal_handler

mono的編譯需要依賴android_krait_signal_handler 這個庫, 在其build_runtime_android.sh腳本里會自動去github上下載這個庫的代碼:

local KRAIT_PATCH_REPO="<git://github.com/Unity-Technologies/krait-signal-handler.git>"

我們可以自己去下載這個庫, 也可以運行 build_runtime_android.sh 讓它去下載, 但是它下載完成以后, 在編譯這個庫的時候是會報錯的, 因此需要手動的去修改其中的 build.pl 文件.

build.pl文件默認會下載到目錄對應mono根目錄的:

../../android_krait_signal_handler

這個文件有兩個問題:

  1. 第一行需要修改為本機上的perl路徑, 例如我的機器修改為
#!/usr/bin/perl -w
  1. 編譯這個庫經(jīng)常需要的并不是編譯mono的ndk版本, 例如這里編譯mono需要r10e, 但編譯android_krait_signal_handler庫需要的是r13b
sub BuildAndroid
{
    PrepareAndroidSDK::GetAndroidSDK(undef, undef, "r13b");
    system('$ANDROID_NDK_ROOT/ndk-build clean');
    system('$ANDROID_NDK_ROOT/ndk-build');
}

雖然腳本會去下載Android NDK r13b, 但是因為我們之前設(shè)置的 ANDROID_NDK_ROOT 環(huán)境變量為r10e的路徑, 因此它每次運行的時候都會去重復下載, 并且下載完成依然會使用環(huán)境變量里的ndk-build去編譯, 版本不對, 所以這個庫經(jīng)常是無法編譯成功的, 而導致mono也無法進入編譯過程.

這里我選擇的辦法是, 手動去官方下載r13b的NDK, 然后手動的去使用r13b的ndk-build去先把這個庫給編譯好, 然后再使用 build.pl 去打zip包即可.

NDK r13e的官網(wǎng)下載地址: https://dl.google.com/android/repository/android-ndk-r13b-linux-x86_64.zip
放置到我本機的目錄: /root/tmp/mono-android/android_ndk/android-ndk-r13b

然后再android_krait_signal_handler的build目錄(/root/tmp/mono-android/android_krait_signal_handler/build)運行:

/root/tmp/mono-android/android_ndk/android-ndk-r13b/ndk-build clean
/root/tmp/mono-android/android_ndk/android-ndk-r13b/ndk-build

如果編譯成功, 則可以使用build.pl去打zip包了.

這里將build.pl的腳本修改一下, 注釋掉BuildAndroid函數(shù)(因為我們已經(jīng)自己build好了), 只保留 ZipIt 函數(shù):

#BuildAndroid();
ZipIt();

然后在該目錄運行一下:

perl build.pl

正常情況下, 會顯示打包成功.

安裝依賴庫

在編譯的過程中, 可能會提示缺少一些庫, 在這個過程里一般是提示缺少什么就安裝什么, 例如我的機器上安裝如下的一些庫:

yum install autoconf automake libtool pkg-config
yum install glib2-devel
yum install pkgconfig glib2
yum install libtool bison
yum install cmake
yum install libc6-dev
yum install ld-linux.so.2(yum install glibc)
yum install zlib

在編譯失敗的時候查看 config.log 文件, 即可查看具體的錯誤信息, 一般情況下都是缺少某些庫.

這里有時候會出現(xiàn)奇怪的一個錯誤就是:

arm-linux-androideabi-gcc: error: unrecognized option '-V'


arm-linux-androideabi-gcc: error: unrecognized option '-qversion'

這里應該是腳本的問題, 因為 arm-linux-androideabi-gcc 查看版本的參數(shù)只支持 -v 和 --version, 而不支持 -V, -qversion, 因此這里需要手動修改一下configure腳本:

#for ac_option in --version -v -V -qversion; do
for ac_option in --version -v; do
  { { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
  *\"* | *\\`* | *\\\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;

將-V -qversion的參數(shù)給去掉, 只保留 -v -version

開始編譯:

依然是在mono根目錄運行:

/external/buildscripts/build_runtime_android.sh

如果沒有問題, 則可以看到編譯成功, 已經(jīng)編譯好的so文件:

Build SUCCESS!
Android STATIC/SHARED libraries are found here: builds/embedruntimes/android

編譯好的文件在目錄:

  • builds
    • embedruntimes
      • android
        • armv5
        • armv6_vfp
        • armv7a
        • x86

每個架構(gòu)下都有編譯好的靜態(tài)庫和動態(tài)庫文件:

  • libmono.a
  • libmono.so

這里對應的放置到Android的lib目錄下即可:

  • lib/armeabi 放置 ARM v5 TE或更高版本(這里對應的armv5或armv6_vfp)
  • lib/armeabi-v7 放置 ARM v7a
  • lib/x86 放置 x86

NOTE ATTRIBUTES

Created Date: 2018-07-13 01:44:14
Last Evernote Update Date: 2020-05-23 07:10:28

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谅将,一起剝皮案震驚了整個濱河市钦椭,隨后出現(xiàn)的幾起案子跨释,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贾富,死亡現(xiàn)場離奇詭異蓝撇,居然都是意外死亡,警方通過查閱死者的電腦和手機缭裆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門键闺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人澈驼,你說我怎么就攤上這事辛燥。” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵挎塌,是天一觀的道長徘六。 經(jīng)常有香客問我,道長榴都,這世上最難降的妖魔是什么待锈? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮嘴高,結(jié)果婚禮上炉擅,老公的妹妹穿的比我還像新娘。我一直安慰自己阳惹,他們只是感情好谍失,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著莹汤,像睡著了一般快鱼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纲岭,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天抹竹,我揣著相機與錄音,去河邊找鬼止潮。 笑死窃判,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的喇闸。 我是一名探鬼主播袄琳,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼燃乍!你這毒婦竟也來了唆樊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤刻蟹,失蹤者是張志新(化名)和其女友劉穎逗旁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舆瘪,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡片效,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了英古。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淀衣。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖哺呜,靈堂內(nèi)的尸體忽然破棺而出舌缤,到底是詐尸還是另有隱情箕戳,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布国撵,位于F島的核電站陵吸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏介牙。R本人自食惡果不足惜壮虫,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望环础。 院中可真熱鬧囚似,春花似錦、人聲如沸线得。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贯钩。三九已至募狂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間角雷,已是汗流浹背祸穷。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留勺三,地道東北人雷滚。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像吗坚,于是被迫代替她去往敵國和親祈远。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345