android开发cmake编译引入第三方库的常用写法
1. 子模块1:gmath静态库CMakeLists.txt
#要求的cmake最小版本
cmake_minimum_required(VERSION 3.4.1)
#打开cmake输出日志
set(CMAKE_VERBOSE_MAKEFILE on)
#添加静态库,库名称gmath
add_library(gmath STATIC src/gmath.c)
#定义变量distribution_DIR, ${CMAKE_CURRENT_SOURCE_DIR}表示当前文件所在的目录
set(distribution_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../distribution)
#设置静态库gmath的输出目录
set_target_properties(gmath
PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY #静态库输出目录
"${distribution_DIR}/gmath/lib/${ANDROID_ABI}")
# 添加自定义命令,拷贝头文件"${CMAKE_CURRENT_SOURCE_DIR}/src/gmath.h"到"${distribution_DIR}/gmath/include/gmath.h"
add_custom_command(TARGET gmath POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E
copy "${CMAKE_CURRENT_SOURCE_DIR}/src/gmath.h"
"${distribution_DIR}/gmath/include/gmath.h"
COMMENT "Copying gmath to output directory")
2. 子模块2:gpref动态库CMakeLists.txt
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_VERBOSE_MAKEFILE on)
#添加动态库,库名称gpref
add_library(gperf SHARED src/gperf.c)
#定义变量distribution_DIR
set(distribution_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../distribution)
#设置动态库gpref的输出目录
set_target_properties(gperf
PROPERTIES
LIBRARY_OUTPUT_DIRECTORY #动态库输出目录
"${distribution_DIR}/gperf/lib/${ANDROID_ABI}")
#添加自定义命令,拷贝头文件
add_custom_command(TARGET gperf POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E
copy "${CMAKE_CURRENT_SOURCE_DIR}/src/gperf.h"
"${distribution_DIR}/gperf/include/gperf.h"
COMMENT "Copying gperf to output directory")
3. 主模块:CMakeLists.txt
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_VERBOSE_MAKEFILE on)
set(lib_src_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(lib_build_DIR $ENV{HOME}/tmp/${ANDROID_ABI})
file(MAKE_DIRECTORY ${lib_build_DIR}) #MAKE_DIRECTORY表示创建目录
#添加子模块,参数1:src目录,参数:bin目录
add_subdirectory(${lib_src_DIR}/gmath ${lib_build_DIR}/gmath)
add_subdirectory(${lib_src_DIR}/gperf ${lib_build_DIR}/gperf)
4. 主工程引入使用gmath静态库和gpref动态库:CMakeLists.txt
cmake_minimum_required(VERSION 3.4.1)
set(distribution_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../../distribution)
#以导入方式添加静态库
add_library(lib_gmath STATIC IMPORTED)
#指定导入的库位置
set_target_properties(lib_gmath PROPERTIES IMPORTED_LOCATION
${distribution_DIR}/gmath/lib/${ANDROID_ABI}/libgmath.a)
#以导入方式添加动态库
add_library(lib_gperf SHARED IMPORTED)
#指定导入的库位置
set_target_properties(lib_gperf PROPERTIES IMPORTED_LOCATION
${distribution_DIR}/gperf/lib/${ANDROID_ABI}/libgperf.so)
#通c++ flags指定使用的c++标准库为gnu++11
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
#添加动态库,库名称hello-libs
add_library(hello-libs SHARED hello-libs.cpp)
#指定头文件路径
target_include_directories(hello-libs PRIVATE
${distribution_DIR}/gmath/include
${distribution_DIR}/gperf/include)
#链接hello-libs到android、lib_gmath、lib_gperf、log。其中android和log是系统自动的库。
target_link_libraries(hello-libs
android
lib_gmath
lib_gperf
log)
5. build.gradle的配置
defaultConfig {
externalNativeBuild {
cmake {//cmake编译方式
arguments '-DANDROID_STL=c++_static' //通过宏指定使用的c++模板库为c++_static
}
}
}
externalNativeBuild {
cmake {
version '3.10.2' //cmake版本号
path 'src/main/cpp/CMakeLists.txt' //CMakeLists.txt文件路径
}
}
Cmake官方文档:https://cmake.org/documentation/ 结合Quick Search快速搜索学习很方便
分类:
android-jni
标签:
android-jni
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2019-09-19 Android开发长按某个控件将PopupWindow显示在手指长按的位置处的实现方法