Android NDK 工具鏈的使用方法(Standalone Toolchain)

轉載:http://blog.csdn.net/smfwuxiao/article/details/6587709linux

首先須要肯定目標機器的指令集。android

若是是 x86 的機器,用 x86-4.4.3 版本的工具鏈;若是是 arm 指令的,用 arm-linux-androideabi-4.4.3 版本 (x86-4.4.3 和 arm-linux-androideabi-4.4.3 位於ndk目錄中)c++

一、gcc 的sysroot 選項架構

sysroot 選項設定 gcc 在編譯源碼的時候,尋找頭文件和庫文件的根目錄。能夠這樣調用 gcc --sysroot=/tmp/gcc-arm (及其餘選項)。NDK 根目錄下的 platforms 目錄中的各個子目錄的路徑均可以直接傳給 gcc --sysroot=<dir>。爲了簡化操做,能夠在linux系統的命令終端執行如下命令,設置SYSROOT環境變量,$NDK是ndk的根目錄。ide

$ SYSROOT=$NDK/platforms/android-8/arch-arm函數

二、調用 NDK gcc(第1種方法)。 設置 SYSROOT以後,要把它傳給 gcc 的 --sysroot 選項。因爲unix/linux自帶的gcc並不是交叉編譯工具,而咱們須要使用的是ndk中提供的交叉編譯工具(也是gcc),因此須要想辦法讓編譯腳本找到ndk中的gcc,而不要去尋找系統中的gcc。而 unix/linux 系統的編譯腳本經常會用 CC 環境變量來引用編譯器,因此經過把 CC 設置爲ndk中的gcc的路徑,就能幫助編譯腳本找到正確的gcc(咱們還能順便加上--sysroot選項)。工具

將CC 按以下設置ui

           $ export CC="$NDK/toolchains/<name>/prebuilt/<host-system>/bin/<prefix>gcc --sysroot=$SYSROOT"編碼

           $ $CC -o foo.o -c foo.c  (沒必要執行這一行,這條命令是調用gcc編譯程序)idea

          上面第1行以後以後,再去執行./configure 就能夠編譯出arm程序了。不過還須要考慮共享庫的連接問題,要確保該程序沒有連接ndk未提供的共享庫。該方法的缺陷就是,不能使用 C++ STL(STLport 或 GNU libstdc++ ),也不能使用異常機制和RTTI。

三、調用NDK編譯器(第2種方法,更簡單)

      android ndk 提供腳本,容許本身定製一套工具鏈。例如:

      $NDK/build/tools/make-standalone-toolchain.sh --platform=android-5 --install-dir=/tmp/my-android-toolchain [ --arch=x86 ]

      將會在/tmp/my-android-toolchain 中建立 sysroot 環境和 工具鏈。--arch 選項選擇目標程序的指令架構,默認是爲 arm。

      若是不加 --install-dir 選項,則會建立 /tmp/ndk/<toolchain-name>.tar.bz2。

      (執行 make-standalone-toolchain.sh --help 查看幫助。)

      運行以後,這樣使用:

      $ export PATH=/tmp/my-android-toolchain/bin:$PATH

      $ export CC=arm-linux-androideabi-gcc

      $ export CXX=arm-linux-androideabi-g++

      $ export CXXFLAGS="-lstdc++"

     執行完以上設置環境變量的命令以後,就能夠直接編譯了(例如,執行 ./configure 而後 make 獲得的就是 arm 程序了)。不用再設定 sysroot, CC 了。並且,可使用 STL,異常,RTTI。

四、ABI 兼容性

     ndk 同時支持 arm5 和 arm7,通常只用 arm5就行了。arm7是高端一點的,NDK 默認也是 arm5 。

     推薦加上 -mthumb 選項給gcc,來生成 16-bit Thumb-1 指令。

     若是要用 arm7,能夠設定 CFLAGS='-march=armv7-a -mfloat-abi=softfp', 使用 Thumb-2 指令,且這兩個選項不能分開!

五、警告 & 限制

5.1 Windows支持

Windows 上的NDK 工具鏈不依賴 Cygwin,於是速度比用 Cygwin 快一點,可是這些工具不能理解

Cygwin 的路徑名(例如, /cygdrive/c/foo/bar)。只能理解  C: /cygdrive/c/foo/bar 這類路徑

不過,NDK 提供的build工具可以很好地應對上述問題(ndk-build)

5.2 wchar_t 支持

       wchar_t  類型僅從 Android 2.3 開始支持。

      在 android-9 上, wchar_t 是 4字節。 而且 C語言庫提供支持寬字符的函數

    (例外:multi-byte 編碼/解碼 函數 和 wsprintf/wsscanf )

      在android-9 之前的平臺上,wchar_t 是1字節,並且寬字符函數不起做用。

      建議不使用 wchar_t,提供 wchar_t 支持是爲了方便移植之前的代碼。

5.3  異常, RTTI 和 STL

      NDK 工具鏈默認支持C++異常和RTTI(Run Time Type Information),能夠用 -fno-exception 和 -fno-rtti 關閉(生成的機器碼更小)

注意: 若是要用這兩個特性,須要顯式連接 libsupc++。例如: arm-linux-androideabi-g++ .... -lsupc++ 

NDK 提供了 libstdc++,於是能夠用 STL,但須要顯式連接 libstdc++ ( gcc ... -lstdc++)。不過在未來能夠不用手動指定這個連接參數。

相關文章
相關標籤/搜索