Linux下搭建Android交叉编译环境
前言
為了能夠在Android平臺上使用一些Linux中的C/C++庫,我們需要使用AndroidNDK來編譯那些Linux庫的源代碼,使用NDK開發時,通常使用Android.mk或者Cmake來構建C/C++代碼
但是一般Linux庫是通過一個configure腳本來生成MakeFile的方式來構建的,在Linux上構建一個Linux庫的一般流程如下:
./configure make make install這樣的話就和我們通常使用NDK時構建C/C++代碼的方式不一樣
一種常見的解決方法就是把configure生成的MakeFile手動轉換為Android.mk或者CmakeList.txt,這種方法在項目規模比較小的時候還比較可行。但是當項目比較龐大,依賴復雜時,就很難去進行轉換了,那么我們就想能不能像上面一樣直接用configure生成MakeFile來進行編譯呢?答案是完全可以,而且這種方法相對于轉換MakeFile的方法還更加簡單易行
我們基本的思路就是在進行編譯的時候,把我們默認用的gcc、g++、ld等編譯工具替換成AndroidNDK中所提供的編譯工具來進行交叉編譯就行了,接下來的內容以在lubuntu 64位系統上為例就講解了搭建編譯環境的過程
參考官方文檔:https://developer.android.com/ndk/guides/standalone_toolchain.html
下載Android NDK
首先到官網下載Android NDK并解壓到某一位置
下載地址:https://developer.android.com/ndk/downloads/index.html
本文中NDK版本為ndk-r14b-linux-x86_64
運行NDK中的環境搭建腳本
終端下進入到AndroidNDK目錄/build/tools/下
運行如下命令
./make_standalone_toolchain.py --arch arm --api 24 --unified-headers --install-dir ~/android-build參數解釋:
–arch:交叉編譯的目標平臺架構,因為我們的Android手機基本都是arm平臺,因此這里寫arm
–unified-headers:使用libc頭文件,相關解釋可以參考 https://android.googlesource.com/platform/ndk.git/+/ndk-r14-release/docs/UnifiedHeaders.md
–api:Android系統的版本
–install-dir:生成的交叉編譯構建工具的輸出位置,這里我把交叉編譯工具生成到了~/android-build下,當然你也可以設置成別的路徑
這個腳本是Android NDK中官方所提供的腳本,功能就是搭建一個交叉編譯環境,腳本的更多參數和詳情請參考前言中給出的官方文檔
編寫腳本模版
在Android交叉編譯工具文件夾的根目錄下新建一個腳本文件android-build.sh,內容如下:
#!/bin/bashANDROID_BUILD=上一步中你生成的Android交叉編譯工具的路徑 API_VERSION=24 PATH=$ANDROID_BUILD/bin:$PATH SYSROOT=$ANDROID_BUILD/sysroot HOST=arm-linux-androideabi CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -D__ANDROID_API__=$API_VERSION" CXXFLAGS="-std=c++11" LIBDIRS="-L$ANDROID_BUILD/arm-linux-androideabi/lib" LDFLAGS="-march=armv7-a -Wl,--fix-cortex-a8 $LIBDIRS" CONFLAGS="--prefix=${SYSROOT}/usr --host=$HOST" PKG_CONFIG_PATH="$SYSROOT/usr/lib/pkgconfig"#configure PKG_CONFIG_PATH=$PKG_CONFIG_PATH CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" LDFLAGS="$LDFLAGS" ./configure $CONFLAGS &&#make & install make && make install這是一個用來編譯Linux庫的腳本模版,之后我們要為Android編譯某個Linux庫的時候,在這個腳本模版的基礎上進行修改即可
我們可以看到這個腳本中定義了許多變量,這些變量都是一些編譯的時候要用到的參數,我們可以看到在腳本中運行configure的時候我們把這些參數傳了進去,這樣我們就可以通過這些參數指定用我們的交叉編譯工具來編譯
腳本中的變量解釋如下:
ANDROID_BUILD:Android交叉編譯工具的路徑
PATH:我們把交叉編譯工具根目錄下的bin文件夾的路徑加入了PATH環境變量中,這樣我們就可以直接運行bin文件下的那些工具了
SYSROOT:編譯時所使用的系統根目錄的路徑,這里解釋下這個系統根目錄是什么意思:我們PC上的Linux系統根目錄就是/,我們在編譯的時候會用到一些系統根目錄中的文件,例如我們為PC上的Linux編譯一些C/C++代碼的時候要用到/usr/include中的頭文件,還要用到/usr/lib中的一些庫,還可能要執行/bin下的一些程序。但是此時我們是要為Android平臺進行交叉編譯,此時用到的頭文件、庫等得是Android平臺的,因此我們要使用交叉編譯工具提供的系統根目錄$ANDROID_BUILD/sysroot
HOST:編譯的目標平臺,我們在configure的參數指定了–host=$HOST(即–host=arm-linux-androideabi)之后,編譯時就會使用形如arm-linux-androideabi-XXX的工具,例如編譯時使用的gcc就會是arm-linux-androideabi-gcc,使用的g++就會是arm-linux-androideabi-g++。還記得之前我們把$ANDROID_BUILD/bin這個路徑加入到PATH環境變量了嗎?arm-linux-androideabi-gcc、arm-linux-androideabi-g++這些編譯工具的文件就在這個bin文件中
CFLAGS:gcc所用的參數,為什么要傳入那些參數請參考前言中官方文檔鏈接
CXXFLAGS:g++所用的參數,這里指定了要使用c++11標準
LIBDIRS:庫文件的路徑,這里是把Android的C++STL庫的路徑加入了庫路徑
LDFLAGS:鏈接器ld使用的參數,為什么要傳入那些參數請參考前言中的官方文檔鏈接
CONFLAGS:運行configure腳本時要傳入的參數,–prefix是指定了make install時的安裝路徑,–host前面解釋過了
PKG_CONFIG_PATH:具體的解釋可以參考這里 http://www.cppblog.com/colorful/archive/2012/05/05/173750.aspx
可以看到我們這個腳本中進行編譯的過程也是先執行configure,然后make和make install,和一般Linux編譯的過程一樣,只是需要指定一些平臺的參數
之后如果我們為Android編譯一些Linux庫,只要把這個腳本復制到合適的位置并進行一些簡單的修改,然后運行這個腳本就可以了,十分方便
Similar Posts
- 編譯Android平臺上的qemu
- C語言中的地址對齊
- C語言中聲明的語法/語義詳解
- C++中的構造函數(二):構造函數代碼擴張
- C++中的構造函數(一):默認構造函數
- C++基礎學習筆記
總結
以上是生活随笔為你收集整理的Linux下搭建Android交叉编译环境的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决Out of memory erro
- 下一篇: Android NDK各版本下载