androidstudio中的ndk開發(fā)環(huán)境搭建

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)試

  1. 下載必要組件

    • 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來下載這些組件妻率。

    下載必要組件截圖
  2. 創(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琢蛤。
  3. 配置和組建項(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

谷歌最新的android.toolchain.cmake

CMakeList.txt命令的官方說明文檔

添加c++代碼studio官方教程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末督暂,一起剝皮案震驚了整個(gè)濱河市羹令,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌损痰,老刑警劉巖福侈,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異卢未,居然都是意外死亡肪凛,警方通過查閱死者的電腦和手機(jī)堰汉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伟墙,“玉大人翘鸭,你說我怎么就攤上這事〈量” “怎么了就乓?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)拱烁。 經(jīng)常有香客問我生蚁,道長(zhǎng),這世上最難降的妖魔是什么戏自? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任邦投,我火速辦了婚禮,結(jié)果婚禮上擅笔,老公的妹妹穿的比我還像新娘志衣。我一直安慰自己,他們只是感情好猛们,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布念脯。 她就那樣靜靜地躺著,像睡著了一般弯淘。 火紅的嫁衣襯著肌膚如雪和二。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天耳胎,我揣著相機(jī)與錄音,去河邊找鬼惕它。 笑死怕午,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的淹魄。 我是一名探鬼主播郁惜,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼甲锡!你這毒婦竟也來了兆蕉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤缤沦,失蹤者是張志新(化名)和其女友劉穎虎韵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缸废,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡包蓝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年驶社,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片测萎。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡亡电,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出硅瞧,到底是詐尸還是另有隱情份乒,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布腕唧,位于F島的核電站或辖,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏四苇。R本人自食惡果不足惜孝凌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望月腋。 院中可真熱鬧蟀架,春花似錦、人聲如沸榆骚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)妓肢。三九已至捌省,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碉钠,已是汗流浹背纲缓。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喊废,地道東北人祝高。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像污筷,于是被迫代替她去往敵國(guó)和親工闺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容