AndroidStudio中CMake多模块多目录编译

简介: 在学习过程接触到了CMake编译,它的好处就是可以跨平台。使用AndroidStudio开发的工程中需要引入第三方库,加上自己的lib库,最后生成指定的SO库,这就涉及到了多模块编译。

在学习过程接触到了CMake编译,它的好处就是可以跨平台。

使用AndroidStudio开发的工程中需要引入第三方库,加上自己的lib库,最后生成指定的SO库,这就涉及到了多模块编译。


JNI目录结构


我的JNI目录结构如下:

cpp/
├── 3rdparty
│   └── libpng
│       ├── CMakeLists.txt  //第三库的CMakeLists.txt文件
│       ├── example.c
│       ├── image.c
│       ├── image.h
│       ├── png.c
│       ├── pngconf.h
│       ├── pngdebug.h
│       ├── png_decoder.cpp
│       ├── png_decoder.h
│       ├── pngerror.c
│       ├── pngget.c
│       ├── png.h
│       ├── pnginfo.h
│       ├── pnglibconf.h
│       ├── pngmem.c
│       ├── pngpread.c
│       ├── pngpriv.h
│       ├── pngread.c
│       ├── pngrio.c
│       ├── pngrtran.c
│       ├── pngrutil.c
│       ├── pngset.c
│       ├── pngstruct.h
│       ├── pngtrans.c
│       ├── pngwio.c
│       ├── pngwrite.c
│       ├── pngwtran.c
│       └── pngwutil.c
├── librenderer
│   ├── CMakeLists.txt    //另一个库,依赖3rdparty/libpng
│   ├── egl_core.cpp
│   ├── egl_core.h
│   ├── pic_preview_controller.cpp
│   ├── pic_preview_controller.h
│   ├── pic_preview_render.cpp
│   ├── pic_preview_render.h
│   ├── pic_preview_texture.cpp
│   ├── pic_preview_texture.h
│   ├── rgba_frame.cpp
│   └── rgba_frame.h
├── CMakeLists.txt    //工程主CMakeLists.txt,依赖librenderer库
├── com_flyscale_opengles_PngPreviewController.h
└── PngPreviewController.cpp

目录介绍


  • cpp目录是主工程目录,主要是JNI部分代码
  • 3rdparty/libpng是第三方库目录
  • librenderer是自已写的封装库,方便以后移植调用

它们有如下依赖关系

工程主目录依赖librenderer,而librenderer依赖3rdparty/libpng


各模块的CMakeLists.txt文件


1. 3rdparty/libpng CMakeLists.txt

列出的配置选项都是必须的

#规定使用的CMake最小版本
CMAKE_MINIMUM_REQUIRED(VERSION 3.4.1)
#指定引入头文件目录为当前目录,注释掉是因为头文件在当前目录,不需要指定了
#include_directories(${CMAKE_CURRENT_SOURCE_DIR})
#设置变量LOCAL_SRC_FILES
SET(LOCAL_SRC_FILES
        example.c
        image.c
        png.c
        png_decoder.cpp
        pngerror.c
        pngget.c
        pngmem.c
        pngpread.c
        pngread.c
        pngrio.c
        pngrtran.c
        pngrutil.c
        pngset.c
        pngtrans.c
        pngwio.c
        pngwrite.c
        pngwtran.c
        pngwutil.c
        )
#指定编译为动态库
ADD_LIBRARY(pngdecoder SHARED ${LOCAL_SRC_FILES})
#链接libz库,因为源码中使用到了相关函数
target_link_libraries(pngdecoder z) #链接系统libz库,必须的

2. librenderer库CMakeLists.txt

该库依赖前面的pngdecoder库。

列出的配置选项都是必须的

#规定使用的CMake最小版本
cmake_minimum_required(VERSION 3.4.1)
#指定引入头文件目录,注释掉是因为通过add_subdirectory方式依赖不需要再指定
*include_directories(../3rdparty/libpng)
#添加外部目录,需要指定绝对路径,该命令会使该目录的执行CMake
add_subdirectory(../3rdparty/libpng ${CMAKE_CURRENT_SOURCE_DIR})
#编译为动态库
add_library(renderer SHARED
        egl_core.cpp
        pic_preview_controller.cpp
        pic_preview_render.cpp
        pic_preview_texture.cpp
        rgba_frame.cpp
        )
#查找OpenGS ES 3.0库
find_library(OPENGLES3_LIBRARY GLESv3 "OpenGL ES v3.0 library")
#查找EGL库
find_library(EGL_LIBRARY EGL "EGL 1.4 library")
#查找log库
find_library(log-lib log)
#查找android库
find_library(android-lib android)
#链接查找的四个库以及依赖的pngdecoder库
target_link_libraries(renderer 
        ${log-lib}
        ${android-lib}  #Native Window所在的库
        ${OPENGLES3_LIBRARY}
        ${EGL_LIBRARY}
        pngdecoder
        )

3. 主工程CMakeLists.txt

依赖librenderer

列出的配置选项都是必须的。

cmake_minimum_required(VERSION 3.4.1)
#注释掉是因为librenderer中已经引入了,不需要重复引入 ,否则报错
#add_subdirectory(3rdparty/libpng)
#引入子目录librenderer,子目录不需要指定绝对路径
add_subdirectory(librenderer)
#编译为动态库
add_library(PngPreview SHARED
        PngPreviewController.cpp
        )
#查找log库,为什么注释掉?因为librender中已经链接过了,可以在该模块代码直接引用该库
find_library(log-lib log .)
target_link_libraries(PngPreview
        #${log-lib}
        renderer
        )

完毕!

目录
相关文章
|
4月前
CMake自动打包--Qt项目
CMake自动打包--Qt项目
63 0
|
6月前
Clion-2023.1.4配置CMake-3.25.3
Clion-2023.1.4配置CMake-3.25.3
|
7月前
|
测试技术
使用CLion创建Cmake项目,使用GoogleTest和GoogleMock对代码进行测试
使用CLion创建Cmake项目,使用GoogleTest和GoogleMock对代码进行测试
178 3
Cmake生成指定vs版本的工程文件
本文简单总结了使用 cmake 生成 visual studio 工程文件的过程
|
搜索推荐 Java Linux
记一次编译Android源码
记一次编译Android源码
|
C++
2022-9-28-CMAKE工程中Cmakelist文档编写的一些注意点
2022-9-28-CMAKE工程中Cmakelist文档编写的一些注意点
114 0
|
Java Android开发
编译安卓项目时报错
编译安卓项目时报错
527 0
编译安卓项目时报错
|
Java 开发工具 C++