Cmake配置
它是一个纯文本文件,并包含构建c/c++使用的命令,配置命令指示创建原生库使用那些源代码,在配置新的 CMake 构建脚本后,您需要配置gradle 将 CMake 项目作为构建依赖项包含在内,从而让 Gradle 构建原生库,并将其与应用的 APK 打包在一起。
创建构建脚本
cmakeList可以创建在任意位置。
- 设置使用的版本
cmake_minimum_required(VERSION 3.4.1)
根据源码生成库
add_library( # Specifies 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 )
在使用 add_library()
向 CMake 构建脚本添加源代码文件或库时,Android Studio 还会在您同步项目后在 Project 视图中显示相关的头文件。不过,为了让 CMake 能够在编译时找到头文件,您需要向 CMake 构建脚本添加命令,并指定头文件的路径:
add_library(...)
# Specifies a path to native header files.
include_directories(src/main/cpp/include/)
生成的库的名字前面加的“lib”,不过在加载的时候,可以直接的忽略掉。
static {
System.loadLibrary("native-lib");
}
上面都是加入我们自己写的代码,如果想使用NDK提供的库,可以使用find_library
,它会去ndk的安装目录下自己查找。这些无需打包apk,甚至本地无需安装,只需要指定路径。
find_library(
log-lib
log
)
为了可以调用函数,需要加一个关联
target_link_libraries(
native-lib (我们自己的)
${log-lib}
)
使用源代码的方式
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} )
添加其他库
添加的步骤类似:
add_library( imported-lib
SHARED
IMPORTED )
然后指定路径
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} )
构建多个CmakeList.txt
如果想要构建多个 CMake 项目并在 Android 项目中包含这些 CMake 项目的输出,您可以使用一个 CMakeLists.txt
文件(即您关联到 Gradle 的那个文件)作为顶级 CMake 构建脚本,并添加其他 CMake 项目作为此构建脚本的依赖项。以下顶级 CMake 构建脚本会使用 add_subdirectory() 命令将另一个 CMakeLists.txt
文件指定为构建依赖项,然后关联其输出,就像处理任何其他预构建库一样。
add_subdirectory( # Specifies the directory of the CMakeLists.txt file.
${lib_src_DIR}
# Specifies the directory for the build outputs.
${lib_build_DIR} )