1. 程式人生 > >CMakeList.txt詳解

CMakeList.txt詳解

CMakeListsts.txt詳解

    當你使用add_library,新增一個原始檔或者庫時,為了確保 CMake 可以在編譯時定位到你的標頭檔案,最好新增include_directories 命令到 CMake 構建指令碼中並指定標頭檔案的路徑:

add_library(...)

# Specifies a path to native header files.
include_directories(src/main/cpp/include/)

    如果您在構建指令碼中指定“native-lib”作為共享庫的名稱,CMake 將建立一個名稱為 libnative-lib.so 的檔案。不過在 Java 程式碼中載入此庫時,請使用您在 CMake 構建指令碼中指定的名稱:

static{System.loadLibrary(“native-lib”);}
  • 新增NDK API

由於 NDK 庫已經是 CMake 搜尋路徑的一部分,您不需要在CMakeLists.txt指定庫的位置 - 只需要向CMake 提供您希望使用的庫的名稱,並將其關聯到您自己的原生庫中。 find_library命令,從NDK API查詢指定名稱的庫,併為該庫賦予一個名稱,該名稱可以在構建指令碼中的其他地方引用,以下是引用log庫的示例

find_library( # Defines the name of the path variable that stores the
              # location of the NDK library.
              log-lib

              # Specifies the name of the NDK library that
              # CMake needs to locate.
              log )

  為了確保原生庫中可以呼叫 log 庫中的函式,需要使用 CMake 構建指令碼中的target_link_libraries命令關聯該庫:

find_library(...)

# Links your native library against one or more other native libraries.
target_link_libraries( # Specifies the target library.
                       native-lib

                       # Links the log library to the target library.
                       ${log-lib} )

    NDK中還包含原始碼形式的庫,在構建和關聯原生庫時,如果需要使用這些程式碼。您可以使用 CMake 構建指令碼中的add_library 命令,將原始碼編譯到原生庫中。但是需要要提供該庫的路徑,您可以使用 ANDROID_NDK 路徑變數,Android Studio 會自動為您定義此變數。示例

add_library( app-glue
             STATIC
             ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c )

# You need to link static libraries against your shared native library.
target_link_libraries( native-lib app-glue ${log-lib} )
  • 新增預構建庫(prebuild)

    新增預構建庫與新增原生庫類似。不過由於庫已經預先構建,您需要使用imported告知CMake 您只希望將庫匯入到專案中:

add_library( imported-lib
             SHARED
             IMPORTED )

然後,您需要使用set_target_properties命令指定庫的路徑,如下所示。如果該庫有多個ABI版本,你可以使用ANDROID_ABI路徑變數

add_library(...)
set_target_properties( # Specifies the target library.
                       imported-lib

                       # Specifies the parameter you want to define.
                       PROPERTIES IMPORTED_LOCATION

                       # Provides the path to the library you want to import.
                       imported-lib/src/${ANDROID_ABI}/libimported-lib.so )

  為了確保 CMake 可以在編譯時定位到標頭檔案,您需要使用include_directories命令,包含標頭檔案的路徑:

include_directories( imported-lib/include/ )

    要將預構建庫關聯到您自己的原生庫中,請將其新增到 CMake構建指令碼的target_link_libraries命令中:

target_link_libraries( native-lib imported-lib app-glue ${log-lib} )

在您構建應用時,Gradle 會自動將匯入的庫打包到 APK 中。您可以使用APK Analyzer驗證Gradle中將哪些庫打包到您的APK中。

常用命令

  #DEFAULT的編譯選項是 CMAKE_C_FLAGS

    # 指定編譯引數

    #SET(CMAKE_CXX_FLAGS "-Wno-error=format-security -Wno-error=pointer-sign")

    #設定生成的SO動態庫最後輸出的路徑

     set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/jniLibs/${ANDROID_ABI})