1.ndk(Native Development Kit) 概念
NDK包括了:
- 從C / C++生成原生代碼庫(kù)所需要的工具和build files。
- 將一致的原生庫(kù)嵌入可以在Android設(shè)備上部署的應(yīng)用程序包文件(application packages files 夫植,即.apk文件)中脊阴。
- 支持所有未來Android平臺(tái)的一系列原生系統(tǒng)頭文件和庫(kù)
為何要用到NDK?
- 代碼的保護(hù),由于apk的java層代碼很容易被反編譯,而C/C++庫(kù)被反編譯的難度較大。
- 在NDK中調(diào)用第三方C/C++庫(kù),因?yàn)榇蟛糠值拈_源庫(kù)都是用C/C++代碼編寫的旅掂。
- 便于移植,用C/C++寫的庫(kù)可以方便在其他的嵌入式平臺(tái)上再次使用访娶。
2.android studio項(xiàng)目中c++代碼添加和調(diào)試
-
下載必要組件
- Android 原生開發(fā)工具包 (NDK):這套工具集允許您為 Android 使用 C 和 C++ 代碼商虐,并提供眾多平臺(tái)庫(kù),讓您可以管理原生 Activity 和訪問物理設(shè)備組件,例如傳感器和觸摸輸入秘车。
- CMake:一款外部構(gòu)建工具典勇,可與 Gradle 搭配使用來構(gòu)建原生庫(kù)。如果您只計(jì)劃使用 ndk-build叮趴,則不需要此組件割笙。
- LLDB:一種調(diào)試程序,Android Studio 使用它來調(diào)試c++代碼眯亦,可以在調(diào)試斷點(diǎn)處查看/更改變量值伤溉、執(zhí)行函數(shù)等等。
可以通過sdk manager來下載這些組件妻率。
下載必要組件截圖 -
創(chuàng)建支持c++的項(xiàng)目
創(chuàng)建項(xiàng)目時(shí)勾選include c++ support
勾選c++ support?
然后next到Customize C++ Support配置c++選項(xiàng)
配置c++選項(xiàng)?c++選項(xiàng)釋義如下:
- C++ Standard:使用下拉列表選擇您希望使用哪種 C++ 標(biāo)準(zhǔn)乱顾。選擇 Toolchain Default 會(huì)使用默認(rèn)的 CMake 設(shè)置。
-
Exceptions Support:如果您希望啟用對(duì) C++ 異常處理的支持宫静,請(qǐng)選中此復(fù)選框糯耍。如果啟用此復(fù)選框,Android Studio 會(huì)將
-fexceptions
標(biāo)志添加到模塊級(jí)build.gradle
文件的cppFlags
中囊嘉,Gradle 會(huì)將其傳遞到 CMake。 -
Runtime Type Information Support:如果您希望支持 RTTI革为,請(qǐng)選中此復(fù)選框扭粱。如果啟用此復(fù)選框,Android Studio 會(huì)將
-frtti
標(biāo)志添加到模塊級(jí)build.gradle
文件的cppFlags
中震檩,Gradle 會(huì)將其傳遞到 CMake琢蛤。
配置和組建項(xiàng)目
創(chuàng)建項(xiàng)目完成后會(huì)默認(rèn)在app moudle根目錄下創(chuàng)建CMakeList.txt,c++代碼默認(rèn)放在src-main-cpp目錄下抛虏〔┢洌可以在app的build-gradle中指定cmake的執(zhí)行文件路徑、過濾生成的abi種類等迂猴∧降可以通過CMakeList.txt定義原生庫(kù)文件的依賴、輸出so文件路徑/名稱等沸毁。值得注意的是有一些變量在cmake官方庫(kù)中未定義峰髓,這些變量是在android.toolchain.cmake中的,例如ANDROID_ABI變量息尺。studio 的Instant Run與使用原生代碼的項(xiàng)目不兼容携兵。Android Studio 會(huì)自動(dòng)停用原生項(xiàng)目的此功能。
- 指定ABI:
默認(rèn)情況下搂誉,Gradle 會(huì)針對(duì) NDK 支持的 ABI將您的原生庫(kù)構(gòu)建到單獨(dú)的 .so
文件中徐紧,并將其全部打包到您的 APK 中。如果您希望 Gradle 僅構(gòu)建和打包原生庫(kù)的特定 ABI 配置,您可以在模塊級(jí) build.gradle
文件中使用 ndk.abiFilters
標(biāo)志指定這些配置并级,如下所示:
android {
...
defaultConfig {
...
ndk {
// Specifies the ABI configurations of your native
// libraries Gradle should build and package with your APK.
abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a',
'arm64-v8a'
}
}
buildTypes {...}
externalNativeBuild {...}
}
官網(wǎng)上說:
在大多數(shù)情況下拂檩,您只需要在 ndk {}
塊中指定 abiFilters
(如上所示),因?yàn)樗鼤?huì)指示 Gradle 構(gòu)建和打包原生庫(kù)的這些版本死遭。不過广恢,如果您希望控制 Gradle 應(yīng)當(dāng)構(gòu)建的配置,并獨(dú)立于您希望其打包到 APK 中的配置呀潭,請(qǐng)?jiān)?defaultConfig.externalNativeBuild.cmake {}
塊配置另一個(gè) abiFilters
標(biāo)志钉迷。
實(shí)際測(cè)試兩者效果并沒有什么差別,都會(huì)控制庫(kù)文件輸出以及apk的.so文件架構(gòu)平臺(tái)钠署。tips:使用 Build > Analyze APK可以查看apk包含的原生.so文件糠聪。
- cmake更改輸出庫(kù)目錄:
cmake文件不展開說明了,此處為更改輸出so路徑為項(xiàng)目根目錄的libss目錄下:
其中設(shè)置CMAKE_LIBRARY_OUTPUT_DIRECTORY方式需要在add_library之前設(shè)置谐鼎,set_target_properties方式需要在add_library之后設(shè)置舰蟆,設(shè)置LIBRARY_OUTPUT_PATH的方式實(shí)際測(cè)驗(yàn)無效。
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../libss/${ANDROID_ABI})
# Old library location variable狸棍。老版本的變量身害,cmake官網(wǎng)雖然沒有說明,實(shí)際測(cè)試已經(jīng)無法工作了
#set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../libss/${ANDROID_ABI})
add_library( # Sets the name of the library.
native-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/cpp/native-lib.cpp )
#自定義target目錄草戈,可以設(shè)置特定名字target的屬性塌鸯,也可以直接更改默認(rèn)的所有target的輸出路徑,文件夾不存在會(huì)自動(dòng)創(chuàng)建唐片。
#set_target_properties(native-lib PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../libss/${ANDROID_ABI} )
- 運(yùn)行構(gòu)建:
執(zhí)行build—>make moudle app
小結(jié):
android studio2.2起開始c++代碼可以直接在studio中編寫打包入apk了,studio默認(rèn)使用cmake進(jìn)行構(gòu)建原生庫(kù)丙猬,cmake所做的其實(shí)是生成MakeFiles然后再調(diào)用ndk-build生成.so文件。cmake可以指定toolchain來生成android平臺(tái)的庫(kù)费韭,如果不指定默認(rèn)生成對(duì)應(yīng)平臺(tái)的庫(kù)茧球,windows下是.dll文件,mac下是.dylib文件星持,studio中默認(rèn)使用的是sdk下的cmake下的android.toolchain.cmake工具鏈文件來生成so文件抢埋。本地的android.toolchain.cmake文件路徑可以在app-.externalNativeBuild-debug-cmake_build_command.txt中查看,默認(rèn)路徑是:/Users/mac02/Library/Android/sdk/cmake/3.6.4111459/android.toolchain.cmake