android studio 中的ndk開發環境搭建

1.ndk(Native Development Kit) 概念

NDK包括了

  • 從C / C++生成原生代碼庫所需要的工具和build files。
  • 將一致的原生庫嵌入可以在Android設備上部署的應用程序包文件(application packages files ,即.apk文件)中。
  • 支持所有未來Android平臺的一系列原生系統頭文件和庫

爲何要用到NDK?

  • 代碼的保護,由於apk的java層代碼很容易被反編譯,而C/C++庫被反編譯的難度較大。
  • 在NDK中調用第三方C/C++庫,因爲大部分的開源庫都是用C/C++代碼編寫的。
  • 便於移植,用C/C++寫的庫可以方便在其他的嵌入式平臺上再次使用。

2.android studio項目中c++代碼添加和調試

  1. 下載必要組件

    • Android 原生開發工具包 (NDK):這套工具集允許您爲 Android 使用 C 和 C++ 代碼,並提供衆多平臺庫,讓您可以管理原生 Activity 和訪問物理設備組件,例如傳感器和觸摸輸入。
    • CMake:一款外部構建工具,可與 Gradle 搭配使用來構建原生庫。如果您只計劃使用 ndk-build,則不需要此組件。
    • LLDB:一種調試程序,Android Studio 使用它來調試c++代碼,可以在調試斷點處查看/更改變量值、執行函數等等。

    可以通過sdk manager來下載這些組件。

    下載必要組件截圖

  2. 創建支持c++的項目

    創建項目時勾選include c++ support

    勾選c++ support

    然後next到Customize C++ Support配置c++選項

    配置c++選項

    ​c++選項釋義如下:

    • C++ Standard:使用下拉列表選擇您希望使用哪種 C++ 標準。選擇 Toolchain Default 會使用默認的 CMake 設置。
    • Exceptions Support:如果您希望啓用對 C++ 異常處理的支持,請選中此複選框。如果啓用此複選框,Android Studio 會將 -fexceptions 標誌添加到模塊級 build.gradle 文件的 cppFlags 中,Gradle 會將其傳遞到 CMake。
    • Runtime Type Information Support:如果您希望支持 RTTI,請選中此複選框。如果啓用此複選框,Android Studio 會將 -frtti 標誌添加到模塊級 build.gradle 文件的 cppFlags 中,Gradle 會將其傳遞到 CMake。
  3. 配置和組建項目

創建項目完成後會默認在app moudle根目錄下創建CMakeList.txt,c++代碼默認放在src-main-cpp目錄下。可以在app的build-gradle中指定cmake的執行文件路徑、過濾生成的abi種類等。可以通過CMakeList.txt定義原生庫文件的依賴、輸出so文件路徑/名稱等。值得注意的是有一些變量在cmake官方庫中未定義,這些變量是在android.toolchain.cmake中的,例如ANDROID_ABI變量。studio 的Instant Run與使用原生代碼的項目不兼容。Android Studio 會自動停用原生項目的此功能。

  • 指定ABI:

默認情況下,Gradle 會針對 NDK 支持的 ABI將您的原生庫構建到單獨的 .so 文件中,並將其全部打包到您的 APK 中。如果您希望 Gradle 僅構建和打包原生庫的特定 ABI 配置,您可以在模塊級 build.gradle 文件中使用 ndk.abiFilters 標誌指定這些配置,如下所示:

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 {...}
}

官網上說:

在大多數情況下,您只需要在 ndk {} 塊中指定 abiFilters(如上所示),因爲它會指示 Gradle 構建和打包原生庫的這些版本。不過,如果您希望控制 Gradle 應當構建的配置,並獨立於您希望其打包到 APK 中的配置,請在 defaultConfig.externalNativeBuild.cmake {} 塊配置另一個 abiFilters 標誌。

實際測試兩者效果並沒有什麼差別,都會控制庫文件輸出以及apk的.so文件架構平臺。tips:使用 Build > Analyze APK可以查看apk包含的原生.so文件。

  • cmake更改輸出庫目錄:

cmake文件不展開說明了,此處爲更改輸出so路徑爲項目根目錄的libss目錄下:

其中設置CMAKE_LIBRARY_OUTPUT_DIRECTORY方式需要在add_library之前設置,set_target_properties方式需要在add_library之後設置,設置LIBRARY_OUTPUT_PATH的方式實際測驗無效。

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../libss/${ANDROID_ABI})
# Old library location variable。老版本的變量,cmake官網雖然沒有說明,實際測試已經無法工作了
#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目錄,可以設置特定名字target的屬性,也可以直接更改默認的所有target的輸出路徑,文件夾不存在會自動創建。
#set_target_properties(native-lib PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../libss/${ANDROID_ABI} )

  • 運行構建:

執行build—>make moudle app

小結:

android studio2.2起開始c++代碼可以直接在studio中編寫打包入apk了,studio默認使用cmake進行構建原生庫,cmake所做的其實是生成MakeFiles然後再調用ndk-build生成.so文件。cmake可以指定toolchain來生成android平臺的庫,如果不指定默認生成對應平臺的庫,windows下是.dll文件,mac下是.dylib文件,studio中默認使用的是sdk下的cmake下的android.toolchain.cmake工具鏈文件來生成so文件。本地的android.toolchain.cmake文件路徑可以在app-.externalNativeBuild-debug-cmake_build_command.txt中查看,默認路徑是:/Users/mac02/Library/Android/sdk/cmake/3.6.4111459/android.toolchain.cmake

谷歌最新的android.toolchain.cmake

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章