介紹Android原生開發工具包r14

谷歌開發者_發表於2017-04-12

640?wx_fmt=gif


現在,可以下載最新版本 Android 原生開發工具包 (NDK)——Android NDK r14。也可以通過 Android Studio 在 SDK 管理器中下載此版本:

https://developer.android.google.cn/ndk/downloads/index.html


那麼 r14 有哪些新增功能?可以在此處檢視完整的變更日誌:

https://github.com/android-ndk/ndk/wiki/Changelog-r14


而其中最突出的功能包括如下: 

  • 將所有平臺標頭更新為統一的標頭(下文詳細介紹)

  • 現在可在 Darwin 和 Linux 上對 Clang 進行連結時優化 (LTO)

  • 現已更新 libc++。您現在可以將 thread_local  用於重要的解構函式統計(僅限 Clang)

  • RenderScript 迴歸!



統一標頭

我們徹底重構了在 NDK 中釋出平臺標標頭檔案的方式。現在,不再是每個目標 API 級別單獨設定一組標頭,而是共同使用一組統一的標頭。在這些標頭中,通過 #if __ANDROID_API__ >= __ANDROID_API_FOO__ 前處理器指令保證 API 可用於每個 Android 平臺。 

之前的方法依靠的是定期捕獲的平臺標頭快照。這意味著,在過去,任何時候我們修復僅與某個標頭有關的錯誤時,除了偶爾的向後移植外,此修復僅在最新版本中可用。現在,錯誤修復可用於任何 NDK API 級別。 

除了錯誤修復之外,這還意味著您可以訪問每個目標版本中最新的 Linux UAPI 標頭。對於移植現有 Linux 程式碼(尤其底層程式碼)的使用者而言,這最為重要。需要記住的重要的一點是:僅僅具有標頭,並不意味著您執行的裝置的核心版本足夠新,可支援所有系統呼叫。一如既往,系統呼叫可能返回 ENOSYS。 

除了 Linux 標頭外,您還可以獲取 OpenGL 和 OpenSLES 等的最新標頭。當您的目標 API 級別版本較舊時,可以更輕鬆地、有條件地使用新 API。現在,儘管在 KitKat 釋出之前該庫不可用,但可以在 Ice Cream Sandwich 中訪問 GLES3 標頭。您仍然需要通過 dlopen/dlsym 使用所有 API 呼叫,但您至少可以訪問呼叫這些函式所需的所有常量和 #defines。 


請注意,從 NDK r16 開始,我們將移除舊版標頭,因此,越早提交錯誤,過渡將會越順利。 

注意

在第三方標頭中,不存在像 OpenGL 中那樣的 API #ifdef Guard。在這些情況下,如果您使用的 API 不適用於目標 API 級別,將出現連結時錯誤(未定義的引用)而非編譯時錯誤。 

目前使用 GCC 的獨立工具鏈不支援開箱即用(未來也不支援)。要使用 GCC,請在編譯時傳遞 -D__ANDROID_API__=$API。 


在您的構建中啟用統一標頭

為了實現舊版標頭向統一標頭的順利過渡,我們預設不啟用新標頭,不過它在 r15 中預設為啟用。您選擇如何使用統一標頭,取決於您的構建系統。 

ndk-build

在 Application.mk 中: 

APP_UNIFIED_HEADERS := true


您也可以像下面這樣從命令列設定此屬性: 

$ ndk-build APP_UNIFIED_HEADERS=true


如果您通過 Gradle 將 ndk-build 用於 externalNativeBuild,請在 build.gradle 中指定以下配置設定: 

android { ... defaultConfig { ... externalNativeBuild { ndkBuild { ... arguments "APP_UNIFIED_HEADERS=true" } } } }


CMake

在配置您的版本時,設定 ANDROID_UNIFIED_HEADERS=ON。常用的設定方式是:使用 cmake -DANDROID_UNIFIED_HEADERS=ON $OTHER_ARGS 來呼叫 CMake。 

如果您通過 Gradle 將 CMake 用於 externalNativeBuild,您可以使用: 
 

android { ... defaultConfig { ... externalNativeBuild { cmake { ... arguments "-DANDROID_UNIFIED_HEADERS=ON" } } } }


獨立工具鏈

在建立獨立工具鏈時,傳遞 --unified-headers。請注意,此選專案前不適用於舊版指令碼 make-standalone-toolchain.sh,而僅適用於 make_standalone_toolchain.py。 

閱讀全文(包括“實驗性 Gradle 外掛”和“自定義構建系統”)及檢視文內所有連結,請點選文末“閱讀原文”。


推薦閱讀:

檢測並消滅“巖羚羊”這種 Android 平臺上的殭屍網路欺詐

Android O開發者預覽版終於推出啦!官方介紹新特性

FlexboxLayout幫助您完成聰明的UI佈局

Android在未來對Java 8語言功能的支援


640?wx_fmt=gif


點選「閱讀原文」,閱讀全文並檢視文內連結

640?wx_fmt=gif

相關文章