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


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

首先需要確定目標機器的指令集。

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

1、gcc 的sysroot 選項

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

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

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

將CC 按如下設置

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

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

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

3、調用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。

4、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、警告 & 限制

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++)。不過在將來可以不用手動指定這個鏈接參數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM