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
        )

完毕!

目录
相关文章
|
28天前
|
编译器 Linux 开发者
【cmake 交叉编译配置设置】CMAKE_TOOLCHAIN_FILE:跨平台编译的秘密武器
【cmake 交叉编译配置设置】CMAKE_TOOLCHAIN_FILE:跨平台编译的秘密武器
40 0
|
7月前
|
C++
Cmake生成指定vs版本的工程文件
本文简单总结了使用 cmake 生成 visual studio 工程文件的过程
|
10月前
|
编译器 Linux C++
QT的cmake项目工程配置
QT的cmake项目工程配置
|
11月前
|
Java Android开发
AndroidStudio导入httpmime jar编译不通过的解决办法
AndroidStudio导入httpmime jar编译不通过的解决办法
113 0
又编译了一次doubango整个项目
又编译了一次doubango整个项目
38 0
|
Java 开发工具 C++
|
缓存
CMake实战二:多个源文件,同一或多个目录
CMake实战一只有单个源文件,现在把add函数写入myMath.cpp的源文件里面,声明放到myMath.h源文件里面
774 0
|
Android开发 C++
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库到 Android Studio 工程 | 配置 build.gradle 构建脚本 )
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库到 Android Studio 工程 | 配置 build.gradle 构建脚本 )
126 0
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库到 Android Studio 工程 | 配置 build.gradle 构建脚本 )

热门文章

最新文章