文章目录

  • 一、拷贝 p7zip 源码中的头文件到 Android Studio 项目中
  • 二、配置 CMakeLists.txt 构建脚本
    • 1、导入动态库
    • 2、导入头文件
  • 三、完整 CMakeLists.txt 构建脚本示例
  • 四、参考资料

前置博客 :

  • 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 修改 7zr 交叉编译脚本 Android.mk | 交叉编译 lib7zr.so 动态库 )
  • 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库到 Android Studio 工程 | 配置 build.gradle 构建脚本 )

一、拷贝 p7zip 源码中的头文件到 Android Studio 项目中


参考 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 修改 7zr 交叉编译脚本 Android.mk | 交叉编译 lib7zr.so 动态库 ) 博客中的 p7zip 源码 , D:\develop\7zip\p7zip_16.02\CPP\ANDROID\7zr\jni\Android.mk 中的 -I 引入头文件参数中 , 涉及的头文件目录 ;

# 设置编译器参数
# -I 指定头文件引入目录 , 会引入后面目录中所有的 .h 头文件
LOCAL_CFLAGS := -DANDROID_NDK  -fexceptions \-DNDEBUG -D_REENTRANT -DENV_UNIX \-DBREAK_HANDLER -D_NO_CRYPTO \-DUNICODE -D_UNICODE -DUNIX_USE_WIN_FILE \-I../../../7zip/Archive \-I../../../7zip/Archive/7z \-I../../../7zip/Archive/BZip2 \-I../../../7zip/Archive/Common \-I../../../7zip/Archive/GZip \-I../../../7zip/Archive/Cab \-I../../../7zip/Archive/Lzma \-I../../../7zip/Archive/Tar \-I../../../7zip/Archive/Zip \-I../../../7zip/Archive/Split \-I../../../7zip/Archive/Z \-I../../../7zip/Compress \-I../../../7zip/Crypto \-I../../../7zip/UI/Console \-I../../../7zip/UI/Common \-I../../../Windows \-I../../../Common \-I../../../7zip/Common \-I../../../../C \
-I../../../myWindows \
-I../../../ \
-I../../../include_windows

构建脚本在 D:\develop\7zip\p7zip_16.02\CPP\ANDROID\7zr\jni\ 目录中 , 对应的 …/…/…/7zip/Archive 目录是 D:\develop\7zip\p7zip_16.02\CPP\7zip\Archive 目录 ,

头文件都在 p7zip_16.02 源码根目录下的 C 和 CPP 目录中 , 将这两个目录中的源码拷贝到 Android Studio 工程下的 cpp 目录中 , 为 lib7zr.so 动态库需要的头文件创建一个 lib7zr 目录 , 存放相关源码 ;

二、配置 CMakeLists.txt 构建脚本


1、导入动态库

导入动态库 :

参考 【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 ) 博客 ;

注意不能使用 set_target_properties 设置导入动态库 , 这种配置在 Android 6.06.06.0 以上的系统中 , 出现找不到路径的问题 ;

只能使用给 gcc / g++ 设置动态库查找路径参数的方式 , 指定动态库的查找路径 ;

使用 set() , 指定一个 CMAKE_CXX_FLAGS 编译器参数 , 在编译器参数后添加 -L 参数指定动态库查找目录 ;

# 设置变量
# CMAKE_CXX_FLAGS 表示会将 C++ 的参数传给编译器
# CMAKE_C_FLAGS 表示会将 C 参数传给编译器# 参数设置 : 传递 CMAKE_CXX_FLAGS C+= 参数给编译器时 , 在 该参数后面指定库的路径
#   CMAKE_SOURCE_DIR 指的是当前的文件地址
#   -L 参数指定动态库的查找路径
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}")

2、导入头文件

导入头文件 : 使用 include_directories 设置头文件的查找路径 ;

# 设置头文件查找路径
include_directories(lib7zr/CPP/7zip/Archivelib7zr/CPP/7zip/Archive/7zlib7zr/CPP/7zip/Archive/BZip2lib7zr/CPP/7zip/Archive/Commonlib7zr/CPP/7zip/Archive/GZiplib7zr/CPP/7zip/Archive/Cablib7zr/CPP/7zip/Archive/Lzmalib7zr/CPP/7zip/Archive/Tarlib7zr/CPP/7zip/Archive/Ziplib7zr/CPP/7zip/Archive/Splitlib7zr/CPP/7zip/Archive/Zlib7zr/CPP/7zip/Compresslib7zr/CPP/7zip/Cryptolib7zr/CPP/7zip/UI/Consolelib7zr/CPP/7zip/UI/Commonlib7zr/CPP/Windowslib7zr/CPP/Commonlib7zr/CPP/7zip/Commonlib7zr/Clib7zr/CPP/myWindowslib7zr/CPPlib7zr/CPP/include_windows)

三、完整 CMakeLists.txt 构建脚本示例



# 指定 CMake 最低版本
cmake_minimum_required(VERSION 3.4.1)# 设置函数库编译
add_library( # 参数 1 : 设置生成的动态库名称native-lib# 参数 2 : 设置生成的函数库类型 : ① 静态库 STATIC ② 动态库 SHAREDSHARED# 参数 3 : 配置要编译的源文件native-lib.cpp)# 使用下面的方式引入动态库会出现于 Android.mk 配置一样的问题 , 6.0 以上的 Android 系统在运行时出现找不到路径的问题# 引入动态库
#add_library(add SHARED IMPORTED)
# 设置函数库的导入路径
#set_target_properties(add PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/armeabi-v7a/libadd.so)# 打印日志信息
#       ${ANDROID_ABI} 的作用是获取当前的 CPU 指令集架构
#           当本次编译 armeabi-v7a CPU 架构时 , ${ANDROID_ABI} 值为 armeabi-v7a
#           当本次编译 x86 CPU 架构时 , ${ANDROID_ABI} 值为 x86
message("CMAKE_SOURCE_DIR : ${CMAKE_SOURCE_DIR}, ANDROID_ABI : ${ANDROID_ABI}")# 到预设的目录查找 log 库 , 将找到的路径赋值给 log-lib
#       这个路径是 NDK 的 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so
#       不同的 Android 版本号 和 CPU 架构 需要到对应的目录中查找 , 此处是 29 版本 32 位 ARM 架构的日志库
#
# 可以不配置 :
#       可以不进行该配置, 直接在后面的 target_link_libraries 中链接 log 也不会出错
find_library(log-liblog)# 打印日志库位置
message(${log-lib})# 设置变量
# CMAKE_CXX_FLAGS 表示会将 C++ 的参数传给编译器
# CMAKE_C_FLAGS 表示会将 C 参数传给编译器# 参数设置 : 传递 CMAKE_CXX_FLAGS C+= 参数给编译器时 , 在 该参数后面指定库的路径
#   CMAKE_SOURCE_DIR 指的是当前的文件地址
#   -L 参数指定动态库的查找路径
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}")# 设置头文件查找路径
include_directories(lib7zr/CPP/7zip/Archivelib7zr/CPP/7zip/Archive/7zlib7zr/CPP/7zip/Archive/BZip2lib7zr/CPP/7zip/Archive/Commonlib7zr/CPP/7zip/Archive/GZiplib7zr/CPP/7zip/Archive/Cablib7zr/CPP/7zip/Archive/Lzmalib7zr/CPP/7zip/Archive/Tarlib7zr/CPP/7zip/Archive/Ziplib7zr/CPP/7zip/Archive/Splitlib7zr/CPP/7zip/Archive/Zlib7zr/CPP/7zip/Compresslib7zr/CPP/7zip/Cryptolib7zr/CPP/7zip/UI/Consolelib7zr/CPP/7zip/UI/Commonlib7zr/CPP/Windowslib7zr/CPP/Commonlib7zr/CPP/7zip/Commonlib7zr/Clib7zr/CPP/myWindowslib7zr/CPPlib7zr/CPP/include_windows)# 链接函数库
#       参数 1 : 本构建脚本要生成的动态库目标
#       参数 2 ~ ... : 后面是之前预编译的动态库或静态库 , 或引入的动态库
target_link_libraries(native-lib# 表示 编译 native-lib 模块, 要链接 lib7zr.so 模块7zr${log-lib})

四、参考资料


参考资料 :

  • 7-Zip 官网 : https://www.7-zip.org/

Android NDK 编译构建脚本参考文档 :

  • ndk-build 脚本 : https://developer.android.google.cn/ndk/guides/ndk-build
  • Android.mk 构建脚本 : https://developer.android.google.cn/ndk/guides/android_mk
  • Application.mk 构建脚本 : https://developer.android.google.cn/ndk/guides/application_mk

博客资源 : 源码 , 编译后的可执行文件, 在 7zip\p7zip_16.02\CPP\ANDROID\7zr\libs\ 目录下 ;

  • 下载地址 : https://download.csdn.net/download/han1202012/18215890
  • GitHub 项目源码 : https://github.com/han1202012/7-Zip

【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程中 | 配置 CMakeLists.txt 构建脚本 )相关推荐

  1. 【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )

    文章目录 一.修改 7zr 交叉编译脚本 Android.mk 二.完整的 7zr 交叉编译脚本 Android.mk 三.交叉编译 lib7zr.a 静态库 四.Android Studio 导入 ...

  2. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )

    文章目录 一.JNI 中 main 函数声明 二.命令字符串切割并传入 main 函数 三.完整代码示例 1.完整 jni 代码 2.完整 java 代码 3.执行结果 四.参考资料 前置博客 : [ ...

  3. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 测试 lib7zr.so 动态库调用 )

    文章目录 一.拷贝 p7zip 源码中的头文件到 Android Studio 项目中 二.完整代码示例 1.Java 层代码 2.JNI 层代码 3.日志头文件 4.执行结果 四.参考资料 前置博客 ...

  4. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库到 Android Studio 工程 | 配置 build.gradle 构建脚本 )

    文章目录 一.拷贝 lib7zr.so 动态库到 Android Studio 工程 二.配置 Module 下的 build.gradle 构建脚本 三.参考资料 一.拷贝 lib7zr.so 动态 ...

  5. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 修改 7zr 交叉编译脚本 Android.mk | 交叉编译 lib7zr.so 动态库 )

    文章目录 一.修改 7zr 交叉编译脚本 Android.mk 二.完整的 7zr 交叉编译脚本 Android.mk 三.交叉编译 lib7zr.so 动态库 四.参考资料 一.修改 7zr 交叉编 ...

  6. 【Android 安装包优化】开启资源压缩 ( 资源压缩配置 | 启用严格模式的资源引用检查 | 自定义保留/移除资源配置 | 资源压缩效果 )

    文章目录 一.开启资源压缩 二.启用严格模式的资源引用检查 三.自定义保留/移除资源配置 四.资源压缩效果 五.完整配置 1.keep.xml 配置 2.build.gradle 构建脚本 六.参考资 ...

  7. 【Android 安装包优化】WebP 应用 ( 4.0 以下兼容 WebP | Android Studio 中使用 libwebp.so 库向下兼容版本 | libwebp 库测试可用性 )

    文章目录 一. Android Studio 中导入 libwebp.so 库 二. Android Studio 中测试 libwebp.so 库 三.参考资料 一. Android Studio ...

  8. 【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表文件格式 | 头文件 数据格式 | 全局字符串池 数据格式 | 包数据 数据格式 | 包头 数据格式 )

    文章目录 一.resources.arsc 资源映射表文件格式 二.头文件 数据格式 三.全局字符串池 数据格式 四.包数据 数据格式 1.包头 数据格式 2.资源类型字符串池 数据格式 3.资源名称 ...

  9. 【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表混淆 | resources.arsc 资源映射表二进制格式分析 | 混淆全局字符串池和资源名称字符串池 )

    文章目录 一.resources.arsc 资源映射表 混淆 二.resources.arsc 资源映射表二进制格式分析 三.参考资料 资源混淆时 , 需要修改混淆 resources.arsc 资源 ...

最新文章

  1. 关于机器学习,不可不知的15个概念
  2. 怎么申请微信支付接口
  3. LeetCode 105 Construct Binary Tree from Preorder and Inorder Traversal-前序中序遍历构造二叉树-Python和Java递归解法
  4. java统计字符串中每个字符出现的次数,统计字符串中每个字符出现的次数
  5. Android开发之Handler机制记录
  6. 针对WEB前端新人的前端知识体系
  7. 验证码绕过(对验证码绕过的理解-----burpsuite)
  8. 【图像去噪】基于matlab小波域双重局部维娜滤板图像去噪【含Matlab源码 1642期】
  9. 【大数据课程设计】出租车轨迹数据分析
  10. Matlab调用系统命令行利用Internet Download Manager(IDM)实现批量下载
  11. 在阿帕奇服务器布置文件,Apache文件列表服务器美化 index of /
  12. 扩展欧几里得算法及其简单应用
  13. 使用PE安装纯净版win7
  14. c语言薛定谔方程,量子力学的核心:薛定谔方程,究竟神奇在哪里?
  15. 小度独立融资,百度上演“大象跳舞”
  16. 在Linux环境下通过百度网盘下载并安装matlab2017a
  17. 2021年焊工(初级)考试报名及焊工(初级)免费试题
  18. 深入剖析FP-Growth原理
  19. 在已安装win10环境中利用EasyBCD引导安装Ubuntu18.04(亲自测试,都是泪)
  20. IE10的网站兼容性问题

热门文章

  1. Java JPanel的使用
  2. 黑马在线教育项目---5、使用填充器创建数据库数据
  3. python编码与存储读取数据(数组字典)
  4. git 版本操作命令大全
  5. CloudStack学习-2
  6. 导航选中后标记的样式实现滑动效果
  7. [HDU] 5444.Elven Postman (堆)
  8. Linux云服务器下Tomcat部署超详细
  9. merge into语句的使用
  10. iOS UICollectionViewCell 的拖动