【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程中 | 配置 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.0 6.0 6.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/Archive
lib7zr/CPP/7zip/Archive/7z
lib7zr/CPP/7zip/Archive/BZip2
lib7zr/CPP/7zip/Archive/Common
lib7zr/CPP/7zip/Archive/GZip
lib7zr/CPP/7zip/Archive/Cab
lib7zr/CPP/7zip/Archive/Lzma
lib7zr/CPP/7zip/Archive/Tar
lib7zr/CPP/7zip/Archive/Zip
lib7zr/CPP/7zip/Archive/Split
lib7zr/CPP/7zip/Archive/Z
lib7zr/CPP/7zip/Compress
lib7zr/CPP/7zip/Crypto
lib7zr/CPP/7zip/UI/Console
lib7zr/CPP/7zip/UI/Common
lib7zr/CPP/Windows
lib7zr/CPP/Common
lib7zr/CPP/7zip/Common
lib7zr/C
lib7zr/CPP/myWindows
lib7zr/CPP
lib7zr/CPP/include_windows)
三、完整 CMakeLists.txt 构建脚本示例
# 指定 CMake 最低版本
cmake_minimum_required(VERSION 3.4.1)
# 设置函数库编译
add_library( # 参数 1 : 设置生成的动态库名称
native-lib
# 参数 2 : 设置生成的函数库类型 : ① 静态库 STATIC ② 动态库 SHARED
SHARED
# 参数 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-lib
log)
# 打印日志库位置
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/Archive
lib7zr/CPP/7zip/Archive/7z
lib7zr/CPP/7zip/Archive/BZip2
lib7zr/CPP/7zip/Archive/Common
lib7zr/CPP/7zip/Archive/GZip
lib7zr/CPP/7zip/Archive/Cab
lib7zr/CPP/7zip/Archive/Lzma
lib7zr/CPP/7zip/Archive/Tar
lib7zr/CPP/7zip/Archive/Zip
lib7zr/CPP/7zip/Archive/Split
lib7zr/CPP/7zip/Archive/Z
lib7zr/CPP/7zip/Compress
lib7zr/CPP/7zip/Crypto
lib7zr/CPP/7zip/UI/Console
lib7zr/CPP/7zip/UI/Common
lib7zr/CPP/Windows
lib7zr/CPP/Common
lib7zr/CPP/7zip/Common
lib7zr/C
lib7zr/CPP/myWindows
lib7zr/CPP
lib7zr/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\ 目录下 ;
相关文章
- android 读取本地数据库db文件(Android sqlite)
- android sdk安装过程,图文详解Android 3.0 SDK安装教程
- android 验证码短信验证码,Android短信验证码倒计时验证的2种常用方式
- 安装Android Studio并创建一个Android Demo
- android进程间通信的方式_Android进程注入
- Android Services Library_android freeware
- Android SDK Tools_android.intent.category.DEFAULT
- Android JetPack~ LiveData (一) 介绍与使用
- 【Android 安装包优化】Android 中使用 7zr 可执行程序 解压缩文件
- 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程中 | 配置 CMakeLists.txt 构建脚本 )
- 【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )
- 【Android 安装包优化】资源打包配置 ( resources.arsc 资源映射表 | 配置国际化资源 )
- 【Android 安装包优化】开启资源压缩 ( 资源压缩配置 | 启用严格模式的资源引用检查 | 自定义保留/移除资源配置 | 资源压缩效果 )
- 【错误记录】Android Studio 编译报错 ( A problem occurred starting process ‘command ‘ninja.exe‘ ‘ )
- 【Android 逆向】使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 反汇编二进制机器码 | 打印反汇编数据 )
- 【错误记录】Android 应用安装后出现两个启动图标 ( 排查应用及依赖库中配置了 android.intent.category.LAUNCHER 的 Activity )
- 【错误记录】编译 Android 版本的 ijkplayer 报错 ( ./init-android.sh: 第 37 行: cd: android/contrib/: 没有那个文件或目录 )
- 【Android Gradle 插件】AaptOptions 配置 ④ (failOnMissingConfigEntry 配置|ignoreAssets/ignoreAssetsPattern配置)
- 【错误记录】Android Studio 编译时 lint 检查报错 ( WARNING: DSL element ‘android.dataBinding.enabled‘ is obsolet )
- 【错误记录】Android 应用安全检测漏洞修复 ( StrandHogg 漏洞 | 设置 Activity 组件 android:taskAffinity=““ )
- 【错误记录】Android Studio 集成 ARoute 编译报错 ( 兼容 support 库和 androidx 库 | add ‘tools:replace=“android:appCo )
- 【Android Gradle 插件】组件化中的 Gradle 构建脚本实现 ⑤ ( 优化 Gradle 构建脚本 | 构建脚本结构 | 闭包定义及用法 | 依赖配置 | android 块配置 )
- Android弹出选项框及指示箭头动画选择详解手机开发
- android Universal Image Loader for Android 说明文档 (1)详解手机开发
- Google向所有用户开放Android Auto测试版
- Android:有份额无利润 腹背受敌
- 在 VirtualBox 中安装 Android 系统
- Android 12 Beta 4带来了更快的搜索体验
- Android拨号盘支持T9搜索和号码搜索等拨号盘案例