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