【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程中 | 配置 CMakeLists.txt 构建脚本 )
文章目錄
- 一、拷貝 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 构建脚本 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 安装包优化】使用 li
- 下一篇: 【Android 安装包优化】使用 li