前言

在android ndk 开发中,是经常需要通过cmakelist 来配置 引入库或者编译配置的。这里总结一些常用的cmakelist 中api 语法。

1.add_library 添加库

c++库:静态库(.a、.lib)和动态库(.so、.dll),更多详情,请度娘。

1.1添加已经编译好的so库

#添加 libavcodec-56.so 库
add_library(avcodec-libSHAREDIMPORTED)
set_target_properties( avcodec-libPROPERTIES IMPORTED_LOCATION${distribution_DIR}/${ANDROID_ABI}/libavcodec-56.so)
  • add_library(): 第一个参数avcodec-lib 是库的别名,第二个参数SHARED是库类型,这里是动态库。第三个参数IMPORTED是引入方式,这里是导入,通常是默认这个。

  • set_target_propeties() 中:第一个参数avcodec-lib 是库的别名 , 第二个参数PROPERTIES IMPORTED_LOCATION是指定引入方式,这里是本地引入。第三个参数${distribution_DIR}/${ANDROID_ABI}/libavcodec-56.so 是so库的路径。

因此,引入第三方的库使用add_library就要使用set_target_propeties这个组合。

1.2 添加c/c++ 源代码编译的库

#添加一个名为webp_view的动态库,指定包含 webp_decode.cpp和webp_view.cpp文件。
add_library(webp_view SHAREDwebp_decode.cppwebp_view.cpp)

这种方式是添加c/c++源码文件,这种不需要使用set_target_propeties()去设置路径。第一个参数webp_view: 是库名字,第二个参数shared: 是动态库,第三个参数webp_decode.cpp webp_view.cpp 是需要参与编译的源文件。

2.find_library 查找库

用于查找使用android ndk 中系统库,比如 打印日志log库。

#查找log库,且重新别名为log-lib
find_library( log-lib  log )

第一个参数log-lib : 重新定义log库的别名 ,第二个参数log : 需要使用库的库名。

3. set 设置变量

用于显示的声明一个变量,比如定义一个变量,其地址是根目录下的libwebp 目录。

# web_simple_proj_dir=项目root目录的绝对路径
get_filename_component(WEBP_SAMPLE_PROJ_DIR${CMAKE_CURRENT_SOURCE_DIR}/../../../.. ABSOLUTE)# 设置webp_src_dir(即libwebp的目录地址)= 项目root目录/libwebp
set(WEBP_SRC_DIR ${WEBP_SAMPLE_PROJ_DIR}/libwebp)

也可以设置cmake 中的一些配置:

设置c++ 11的版本:

# 使用c++11
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall")

设置c 99 的版本:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")

更改so库中一些输出路径: 比如输出在在app/src/main下看到jniLibs目录

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

4. include_directories 导入头文件

4.1 include_directories

当前CMakeList.txt中的所有目标以及所有在其调用点之后添加的子目录中的所有目标将具有此头文件搜索路径。

#导入ndk 中native_app_glue目录下的头文件
include_directories(${ANDROID_NDK}/sources/android/native_app_glue)

4.2 target_include_directories

格式:target_include_directories(<target> [SYSTEM] [AFTER|BEFORE] <INTERFACE|PUBLIC|PRIVATE> [items1…])

指定目标tagert 包含的头文件路径。

  • INTERFACE:target对应的头文件使用
  • PRIVATE:target对应的源文件使用
  • PUBLIC:target对应的头文件、源文件都使用
# 为web_view 导入指定的头文件( private 限定是源文件才可以使用导入的头文件)。
target_include_directories(webp_view PRIVATE${WEBP_SRC_DIR}/examples${WEBP_SRC_DIR}/src)

ps:如果有不同目录相同名称的头文件会产生影响,所以这里建议针对特定的target进行添加头文件的操作,不要使用include_directories

5.link_libraries 关联需链接的库

在linux中c/c++的编译一般都是用gcc来编译的,c/c++编译时会产生.o文件要通过make工具来把这些.o文件链接起来,这样才能得一个可执行程序。所以.so在编译时要把所有库链接起来才能编。

target_link_libraries 是为了关联我们自己的库和一些第三方库或者系统库。把要链接的库别名都写到这里就可以了,如果是系统的库要用这个格式${库的名字},比如:

# 为webp_view 添加各种依赖库
target_link_libraries(webp_view android log m native_app_glue webp)

6.add_subdirectory 添加其他cmakelist 编译

在实际开发中,项目可能还包含其他子项目(使用一些开源库的源码)的编译,这时需要指定子项目的cmakelist 参与编译。

#调用libwebp module 下 CamkeList.txt
add_subdirectory(${WEBP_SRC_DIR} ${WEBP_SRC_DIR}/build/)

add_subdirectory() 是可以引入多个需要编译的cmakelist 的目录。这里webp_src_dir 在3.set设置变量中定义好的路径=项目root目录/libwebp。

7.一个谷歌官方的webp 的cmakelist 案例

先看下webp lib库的目录结构:

接着看下app工程 的目录结构:

最后看下app module中完整cmakelist :

# 使用camke 的版本
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_VERBOSE_MAKEFILE on)# 定义一个变量web_simple_proj_dir=项目root目录的绝对路径
get_filename_component(WEBP_SAMPLE_PROJ_DIR${CMAKE_CURRENT_SOURCE_DIR}/../../../.. ABSOLUTE)# 设置webp_src_dir(即libwebp的目录地址)= 项目root目录/libwebp
set(WEBP_SRC_DIR ${WEBP_SAMPLE_PROJ_DIR}/libwebp)# clone the dependency repo.
# git submodule could also be used if this sample does not need
#     Android Studio's "Import Android code sample" option# 若是不存在libwebp module(即不存在libwebp 目录或者libwebp/CMakeLists.txt) ,执行 从谷歌仓库拷贝 libwebp 1.0.0版本 到webp_src_dir的目录下。
# 或者通过AndroidStudio  import 导入方式导入libwebp module源码
if ((NOT EXISTS ${WEBP_SRC_DIR}) OR(NOT EXISTS ${WEBP_SRC_DIR}/CMakeLists.txt))execute_process(COMMAND git clone -b 1.0.0https://chromium.googlesource.com/webm/libwebplibwebpWORKING_DIRECTORY ${WEBP_SAMPLE_PROJ_DIR}/)
endif()SET(WEBP_ENABLE_SWAP_16BIT_CSP ON CACHE BOOL"Enable byte swap for 16 bit colorspaces." FORCE)#调用libwebp module 下 CamkeList.txt
add_subdirectory(${WEBP_SRC_DIR} ${WEBP_SRC_DIR}/build/)# build native_app_glue as a static lib
# 导入ndk路径/source/android/native_app_glue 目录下的头文件
include_directories(${ANDROID_NDK}/sources/android/native_app_glue)
#添加一个名为native_app_glue的静态库,包含的文件有ndk路径/source/android/native_app_glue.c
add_library(native_app_glue STATIC${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c)# 使用c99 版本
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
# 使用c++11
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall")# Export ANativeActivity_onCreate(),# Refer to: https://github.com/android-ndk/ndk/issues/381.
set(CMAKE_SHARED_LINKER_FLAGS"${CMAKE_SHARED_LINKER_FLAGS} -u ANativeActivity_onCreate")#添加一个名为webp_view的动态库,指定包含 webp_decode.cpp和webp_view.cpp文件。
add_library(webp_view SHAREDwebp_decode.cppwebp_view.cpp)
# 为web_view 导入指定的头文件( private 限定是源文件才可以使用导入的头文件)。
target_include_directories(webp_view PRIVATE${WEBP_SRC_DIR}/examples${WEBP_SRC_DIR}/src)# 为webp_view 添加各种依赖库
target_link_libraries(webp_view android log m native_app_glue webp)

Android NDK 之CmakeList 笔记相关推荐

  1. android ndk 头文件,笔记:Android源码和NDK目录及头文件

    NDK目录: 1. 系统调用号定义:  android-ndk-r9d/platforms/android-19/arch-arm/usr/include/asm/unistd.h 2. 系统中断号定 ...

  2. android NDK 知识汇总

    原汇总: [eoeAndroid社区索引]android开发环境NDK教程问题汇总帖 http://www.eoeandroid.com/thread-165553-1-1.html 环境: Wind ...

  3. 怎么新建android.mk,Android NDK简单编写HelloWorld过程笔记(详细)

    Android NDK,坑啊,对于不会c的人来说更是坑啊,弄了一整天才把程序调出来,在网上找了各种资料,各种解决出现的bug,终于是能够运行了. 考虑了一下,还是做个目录吧. 1.创建一个项目 2.编 ...

  4. Android NDK学习笔记(转)

    前言 Android系统中的应用程序都是用Java开发的.Android NDK使我们能够在android上使用C/C++开发的原生代码.有两个理由使用NDK: 一是合理的重用现有的代码:二是在程序中 ...

  5. Android NDK学习笔记1:基础

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/119005718 本文出自[赵彦军的博客] 文章目录 (一)什么是Android N ...

  6. Android NDK开发入门学习笔记(图文教程,极其详尽)

    以前也简单用过JNI,但是只是简单用一下,好多都不明白.最近在看源码部分,有涉及到JNI调用的,所以这次打算彻底把它搞定. 先普及一下JNI的调用关系:JAVA-------------------- ...

  7. CMake 构建项目Android NDK项目基础知识

    本篇文章将介绍如何使用 CMake 构建实现你的第一个 NDK 项目. ##前言 你好!欢迎来到我的的学习笔记分享系列,第一次给大家分享的是 Android NDK 开发的学习笔记,让我们先开始了解 ...

  8. NDK 高级编程(笔记)

    Android 开发中针对 NDK 的书籍很少,<Pro Android C++ with the NDK>也是出版的比较早的一本书,有些内容可能对现在的开发并不适用.但是书中介绍的内容比 ...

  9. 【CMake】CMake 引入 ( Android NDK 构建脚本 | CMake 命令手册 )

    文章目录 一.Android NDK 构建脚本 二.CMake 构建脚本示例 三.CMake 命令手册 1.CMake 脚本命令 2.CMake 工程命令 该系列博客的应用场景是 Android St ...

最新文章

  1. memory matlab,memory – 在MATLAB中处理大量结构
  2. Lesson 16.4 卷积遇见深度学习
  3. 火狐浏览器mac_Firefox火狐浏览器73.0版本发布,有哪些期待已久的新功能?
  4. Web框架之Django_06 模型层了解(F查询、Q查询、事务、update和save、only和defer、choice属性、bulk_create)
  5. java 安卓 html_java – Android的HtmlUnit替代品?
  6. Java多线程之集合类(线程安全和不安全)
  7. HDLBits答案(6)_硬件模块设计的思考方式
  8. JAVA类和对象访问_Java类和对象
  9. 【LetCode算法修炼】Two Sum
  10. 转:性能测试常见术语
  11. 马士兵AI人工智能工程师
  12. Charles青花瓷安装使用及断点设置
  13. 求助ReportMachine报表,收集ReportMachine资料
  14. php私人云,PHP源码Cloudreve乐云网盘私人云盘源码 资源下载不限速功能
  15. html实现pdf导出excel表格,纯前端文件导出-Excel/PDF
  16. 多张eps合并成一张
  17. python求小于n的所有素数_Python-列出N以下所有素数的最快方法
  18. react-native 使用高德SDK取得位置信息
  19. DevExpress中实现给GridControl下的GridView表格修改指定行、列的背景颜色和获取选择行的信息
  20. SSH+ExtJs4开发项目的Demo实例视频讲解

热门文章

  1. Nginx-域名跳转到另外一个域名
  2. 对比九毛九、海底捞,绿茶餐厅值得投资吗?
  3. 基于opencv做一个HSV的颜色选择器
  4. jquery 判断元素下是不是有子元素
  5. outlook中可以添加html代码,在ICS文件中为Outlook预约添加HTML
  6. 联想计算机硬件配置表,电脑配置联想,联想电脑硬件配置
  7. ssis ssrs mysql_【软件】SSIS vs SSAS vs SSRS
  8. 输入法怎么删除惯用字
  9. 《HelloGitHub》第 68 期
  10. TensorFlow 警告Cause: module 'gast' has no attribute 'Num'