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