美文网首页
AndroidStudio中CMake多模块多目录编译

AndroidStudio中CMake多模块多目录编译

作者: DD_Dog | 来源:发表于2019-11-28 16:56 被阅读0次

在学习过程接触到了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
        )

完毕!

相关文章

网友评论

      本文标题:AndroidStudio中CMake多模块多目录编译

      本文链接:https://www.haomeiwen.com/subject/iqmbwctx.html