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