in Cross compile

使用 Android NDK 產生 standalone toolchain

步驟 1:前往 Android ndk 官網:http://developer.android.com/intl/zh-tw/ndk/downloads/index.html

依照自己的作業系統下載自我解壓縮檔。下面以 Linux Ubuntu 為例,用此作業系統較易進行跨編譯,用 Windows 則需要使用 Cygwin,較複雜且使用不易。

步驟 2:下載解壓檔後,切換到檔的目錄下開啟終端機,執行下列的指令:


chmod a+x android-ndk-r10c-linux-x86_64.bin

步驟 3:依照自己需求,產生相對應 Android API level 版本,以便可以在那個版本系統上執行,否則對應錯誤會導致編譯出執行檔無法執行。(可向下相容)

 

出現類似如下的錯誤:


CANNOT LINK EXECUTABLE: cannot locate symbol "sigfillset" referenced by "./rgbimg"...

PIE 簡介:Error: only position independent executables (PIE) are supported

PIE這個安全機制從4.1引入,但是Android L之前的系統版本並不會去檢驗可執行文件是否基於PIE編譯出的。因此不會報錯。但是Android L已經開啟驗證,如果調用的可執行文件不是基於 PIE 方式編譯的,則無法運行。

Executables with PIE (Position Independent Execution) have been supported since Android 4.1. It is a security feature involving address space layout randomization(ASLR) to prevent attacks such as buffer overflow. In Android’s latest release Lollipop, PIE has been made a requirement.

Android 平台對應參考:

platforms: see http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels

  1. Android 1.5 API level 3 (arm/neon)
  2. Android 1.6 API level 4 (arm/neon)
  3. Android 2.0 API level 5 (arm/neon)
  4. Android 2.2.x API level 8
  5. Android 2.3-2.3.2 API level 9 (arm/neon, x86, mips)
  6. Android 2.3.3-2.3.4 API level 10
  7. Android 3.0.x API level 11
  8. Android 3.1.x API level 12
  9. Android 3.2 API level 13
  10. Android 4.0-4.0.2 API level 14
  11. Android 4.0.3-4.0.4 API level 15
  12. Android 4.1 API level 16
  13. Android 4.2 API level 17
  14. Android 4.3 API level 18
  15. Android 4.4 API level 19
  16. Android 5.0 API level 21
  17. Android 5.1 API level 22

步驟 4:執行產生 standalone toolchain 指令:


cd ~/android-ndk-r10e/build/tools

./make-standalone-toolchain.sh --platform=android-16 --install-dir=/home/lab501/android-toolchain-16 --ndk-dir=/home/lab501/android-ndk-r10e --toolchain=arm-linux-androideabi-4.8 --system=linux-x86_64

–install-dir 產生的 toolchain 要安裝的目錄,–ndk-dir 是指定的 ndk 目錄。

產生工具就到這裡結束。下回開始教如何編譯一個 Node.js 在 Android 上執行。