【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 测试 lib7zr.so 动态库调用 )
文章目錄
- 一、拷貝 p7zip 源碼中的頭文件到 Android Studio 項目中
- 二、完整代碼示例
- 1、Java 層代碼
- 2、JNI 層代碼
- 3、日志頭文件
- 4、執(zhí)行結(jié)果
- 四、參考資料
前置博客 :
- 【Android 安裝包優(yōu)化】使用 lib7zr.so 動態(tài)庫處理壓縮文件 ( 修改 7zr 交叉編譯腳本 Android.mk | 交叉編譯 lib7zr.so 動態(tài)庫 )
- 【Android 安裝包優(yōu)化】使用 lib7zr.so 動態(tài)庫處理壓縮文件 ( 拷貝 lib7zr.so 動態(tài)庫到 Android Studio 工程 | 配置 build.gradle 構(gòu)建腳本 )
- 【Android 安裝包優(yōu)化】使用 lib7zr.so 動態(tài)庫處理壓縮文件 ( 拷貝 lib7zr.so 動態(tài)庫頭文件到 Android 工程中 | 配置 CMakeLists.txt 構(gòu)建腳本 )
一、拷貝 p7zip 源碼中的頭文件到 Android Studio 項目中
在上一篇博客 【Android 安裝包優(yōu)化】使用 lib7zr.so 動態(tài)庫處理壓縮文件 ( 拷貝 lib7zr.so 動態(tài)庫頭文件到 Android 工程中 | 配置 CMakeLists.txt 構(gòu)建腳本 ) 中 , 將 lib7zr.so 動態(tài)庫需要的頭文件都拷貝到了 Android Studio 工程中 , 并配置了 CMakeLists.txt 構(gòu)建腳本 ;
本篇博客開發(fā) JNI 類 , 驗證 lib7zr.so 動態(tài)庫 ;
在 【Android 安裝包優(yōu)化】Android 中使用 7zr 可執(zhí)行程序 解壓縮文件 博客的 Android 項目的基礎(chǔ)上進行開發(fā) ;
首先加載 libnative-lib.so 動態(tài)庫 , 這是 CMakeLists.txt 編譯出來的動態(tài)庫 , 聲明 native 方法 ;
class MainActivity : AppCompatActivity() {companion object {init {System.loadLibrary("native-lib")}}external fun executeCmd(cmd: String): Unit }在 JNI 層的 C++ 文件中實現(xiàn)上述 native 方法 , MainActivity 類的包名是 kim.hsl.a7_zip , 因此 executeCmd 方法對應(yīng)的 JNI 層的方法是 Java_kim_hsl_a7_1zip_MainActivity_executeCmd ;
extern "C" JNIEXPORT void JNICALL Java_kim_hsl_a7_1zip_MainActivity_executeCmd(JNIEnv* env, jobject thiz, jstring cmd) {LOGI("7zTypes SZ_OK = %d", SZ_OK ); }二、完整代碼示例
1、Java 層代碼
Java 層代碼 :
package kim.hsl.a7_zipimport android.os.Build import android.os.Bundle import android.util.Log import androidx.appcompat.app.AppCompatActivity import java.io.*class MainActivity : AppCompatActivity() {companion object {val TAG = "MainActivity"init {System.loadLibrary("native-lib")}}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)copy7zr()compress7z()uncompress7z()executeCmd("7z")}/*** 將 7zr 文件拷貝到應(yīng)用私有目錄*/fun copy7zr() {Log.i(TAG, "開始拷貝 7zr 文件")// /data/user/0/kim.hsl.a7_zip/files/7zrvar exeFile = File(filesDir, "7zr")Log.i(TAG, "filesDir = ${filesDir.absolutePath} , exeFile = ${exeFile.absolutePath}")// 查看該文件是否存在, 如果存在設(shè)置該文件可執(zhí)行// 如果不存在 , 拷貝文件if (exeFile.exists()) {exeFile.setExecutable(true)Log.i(TAG, "內(nèi)置存儲空間存在該 /data/user/0/kim.hsl.a7_zip/files/7zr 文件")return} else {Log.i(TAG, "內(nèi)置存儲空間不存在 7zr 可執(zhí)行文件 , 開始拷貝文件")}// 如果不存在 , 拷貝文件var inputStream: InputStream = assets.open("libs/arm64-v8a/7zr")// /data/user/0/kim.hsl.a7_zip/files/7zrvar fileOutputStream: FileOutputStream = FileOutputStream(exeFile)Log.i(TAG, "Build.CPU_ABI = ${Build.CPU_ABI}")// 不同 CPU 架構(gòu)拷貝不同的可執(zhí)行程序if (Build.CPU_ABI.startsWith("armeabi-v7a")) {inputStream = assets.open("libs/armeabi-v7a/7zr")} else if (Build.CPU_ABI.startsWith("arm64-v8a")) {inputStream = assets.open("libs/arm64-v8a/7zr")} else if (Build.CPU_ABI.startsWith("x86")) {inputStream = assets.open("libs/x86/7zr")} else if (Build.CPU_ABI.startsWith("x86_64")) {inputStream = assets.open("libs/x86_64/7zr")}// 拷貝文件var buffer: ByteArray = ByteArray(1024)var readCount = inputStream.read(buffer);while (readCount != -1) {fileOutputStream.write(buffer)readCount = inputStream.read(buffer);}fileOutputStream.flush()fileOutputStream.close()Log.i(TAG, "拷貝 7zr 文件結(jié)束")}/*** 使用 7zr 進行壓縮*/fun compress7z() {// /data/user/0/kim.hsl.a7_zip/files/7zrvar exeFile = File(filesDir, "7zr")// 執(zhí)行前賦予可執(zhí)行權(quán)限exeFile.setExecutable(true)var file_7z = File("${filesDir.absolutePath}/files.7z")if(file_7z.exists()){file_7z.delete()}var cmd = "${exeFile.absolutePath} a ${filesDir.absolutePath}/files.7z ${filesDir.absolutePath} -mx=9 -t7z"Log.i(TAG, "壓縮命令 : $cmd")var process: Process = Runtime.getRuntime().exec(cmd)// 讀取命令執(zhí)行過程數(shù)據(jù)var reader = BufferedReader(InputStreamReader(process.inputStream))while (true) {val line = reader.readLine()if (line != null) {Log.i(TAG, "$line")}else{break}}val exitValue = process.exitValue()Log.i(TAG, "壓縮文件 , 執(zhí)行完畢 , exitValue = $exitValue")}/*** 判定命令是否執(zhí)行完畢* 調(diào)用 process.exitValue 方法 , 如果沒有執(zhí)行完畢 , 會拋異常,* 如果執(zhí)行完畢會返回一個確定的值*/fun isComplete(process: Process): Boolean {try {// 已經(jīng)執(zhí)行完畢process.exitValue()return true} catch (e: IllegalThreadStateException) {// 未執(zhí)行完畢return false}}/*** 使用 7zr 進行解壓縮*/fun uncompress7z() {// /data/user/0/kim.hsl.a7_zip/files/7zrvar exeFile = File(filesDir, "7zr")// 執(zhí)行前賦予可執(zhí)行權(quán)限exeFile.setExecutable(true)// 刪除解壓目錄var unzip_file = File("${filesDir.absolutePath}/unzip_file")if(unzip_file.exists()){recursionDeleteFile(unzip_file)}var cmd = "${exeFile.absolutePath} x ${filesDir.absolutePath}/files.7z -o${filesDir.absolutePath}/unzip_file"Log.i(TAG, "解壓縮命令 : $cmd")var process: Process = Runtime.getRuntime().exec(cmd)// 讀取命令執(zhí)行過程數(shù)據(jù)var reader = BufferedReader(InputStreamReader(process.inputStream))while (true) {val line = reader.readLine()if (line != null) {Log.i(TAG, "$line")}else{break}}val exitValue = process.exitValue()Log.i(TAG, "解壓縮文件 , 執(zhí)行完畢 , exitValue = $exitValue")}/*** 遞歸刪除文件*/fun recursionDeleteFile(file: File) {if (file.isDirectory) {// 如果是目錄 , 則遞歸刪除file.listFiles().forEach {// ForEach 循環(huán)刪除目錄recursionDeleteFile(it)}} else {// 如果是文件直接刪除file.delete()}}external fun executeCmd(cmd: String): Unit }2、JNI 層代碼
#include <jni.h> #include <string> #include <7zTypes.h> #include "logging_macros.h"extern "C" JNIEXPORT void JNICALL Java_kim_hsl_a7_1zip_MainActivity_executeCmd(JNIEnv* env, jobject thiz, jstring cmd) {LOGI("7zTypes SZ_OK = %d", SZ_OK ); }
3、日志頭文件
日志打印頭文件 :
// // Created by octop on 2021/5/6. //#ifndef INC_7_ZIP_LOGGING_MACROS_H #define INC_7_ZIP_LOGGING_MACROS_H#include <android/log.h>#if 1 #ifndef MODULE_NAME #define MODULE_NAME "octopus" #endif#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, MODULE_NAME, __VA_ARGS__) #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, MODULE_NAME, __VA_ARGS__) #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, MODULE_NAME, __VA_ARGS__) #define LOGW(...) __android_log_print(ANDROID_LOG_WARN,MODULE_NAME, __VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,MODULE_NAME, __VA_ARGS__) #define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,MODULE_NAME, __VA_ARGS__)#define ASSERT(cond, ...) if (!(cond)) {__android_log_assert(#cond, MODULE_NAME, __VA_ARGS__);} #else#define LOGV(...) #define LOGD(...) #define LOGI(...) #define LOGW(...) #define LOGE(...) #define LOGF(...) #define ASSERT(cond, ...)#endif#endif //INC_7_ZIP_LOGGING_MACROS_H4、執(zhí)行結(jié)果
執(zhí)行結(jié)果 :
2021-05-06 20:44:57.920 8966-8966/kim.hsl.a7_zip I/MainActivity: 開始拷貝 7zr 文件 2021-05-06 20:44:57.921 8966-8966/kim.hsl.a7_zip I/MainActivity: filesDir = /data/user/0/kim.hsl.a7_zip/files , exeFile = /data/user/0/kim.hsl.a7_zip/files/7zr 2021-05-06 20:44:57.924 8966-8966/kim.hsl.a7_zip I/MainActivity: 內(nèi)置存儲空間存在該 /data/user/0/kim.hsl.a7_zip/files/7zr 文件 2021-05-06 20:44:57.925 8966-8966/kim.hsl.a7_zip I/MainActivity: 壓縮命令 : /data/user/0/kim.hsl.a7_zip/files/7zr a /data/user/0/kim.hsl.a7_zip/files/files.7z /data/user/0/kim.hsl.a7_zip/files -mx=9 -t7z 2021-05-06 20:45:00.074 8966-8966/kim.hsl.a7_zip I/MainActivity: 7-Zip (a) [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21 2021-05-06 20:45:00.074 8966-8966/kim.hsl.a7_zip I/MainActivity: p7zip Version 16.02 (locale=utf8,Utf16=on,HugeFiles=on,64 bits,8 CPUs LE) 2021-05-06 20:45:00.074 8966-8966/kim.hsl.a7_zip I/MainActivity: Scanning the drive: 2021-05-06 20:45:00.074 8966-8966/kim.hsl.a7_zip I/MainActivity: 13 folders, 6 files, 5965824 bytes (5826 KiB) 2021-05-06 20:45:00.074 8966-8966/kim.hsl.a7_zip I/MainActivity: Creating archive: /data/user/0/kim.hsl.a7_zip/files/files.7z 2021-05-06 20:45:00.075 8966-8966/kim.hsl.a7_zip I/MainActivity: Items to compress: 19 2021-05-06 20:45:00.075 8966-8966/kim.hsl.a7_zip I/MainActivity: Files read from disk: 6 2021-05-06 20:45:00.075 8966-8966/kim.hsl.a7_zip I/MainActivity: Archive size: 309075 bytes (302 KiB) 2021-05-06 20:45:00.075 8966-8966/kim.hsl.a7_zip I/MainActivity: Everything is Ok 2021-05-06 20:45:00.075 8966-8966/kim.hsl.a7_zip I/MainActivity: 壓縮文件 , 執(zhí)行完畢 , exitValue = 0 2021-05-06 20:45:00.078 8966-8966/kim.hsl.a7_zip I/MainActivity: 解壓縮命令 : /data/user/0/kim.hsl.a7_zip/files/7zr x /data/user/0/kim.hsl.a7_zip/files/files.7z -o/data/user/0/kim.hsl.a7_zip/files/unzip_file 2021-05-06 20:45:00.088 8966-8966/kim.hsl.a7_zip I/MainActivity: 7-Zip (a) [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21 2021-05-06 20:45:00.088 8966-8966/kim.hsl.a7_zip I/MainActivity: p7zip Version 16.02 (locale=utf8,Utf16=on,HugeFiles=on,64 bits,8 CPUs LE) 2021-05-06 20:45:00.088 8966-8966/kim.hsl.a7_zip I/MainActivity: Scanning the drive for archives: 2021-05-06 20:45:00.088 8966-8966/kim.hsl.a7_zip I/MainActivity: 1 file, 309075 bytes (302 KiB) 2021-05-06 20:45:00.088 8966-8966/kim.hsl.a7_zip I/MainActivity: Extracting archive: /data/user/0/kim.hsl.a7_zip/files/files.7z 2021-05-06 20:45:00.135 8966-8966/kim.hsl.a7_zip I/MainActivity: -- 2021-05-06 20:45:00.135 8966-8966/kim.hsl.a7_zip I/MainActivity: Path = /data/user/0/kim.hsl.a7_zip/files/files.7z 2021-05-06 20:45:00.135 8966-8966/kim.hsl.a7_zip I/MainActivity: Type = 7z 2021-05-06 20:45:00.135 8966-8966/kim.hsl.a7_zip I/MainActivity: Physical Size = 309075 2021-05-06 20:45:00.135 8966-8966/kim.hsl.a7_zip I/MainActivity: Headers Size = 298 2021-05-06 20:45:00.135 8966-8966/kim.hsl.a7_zip I/MainActivity: Method = LZMA2:6m 2021-05-06 20:45:00.135 8966-8966/kim.hsl.a7_zip I/MainActivity: Solid = + 2021-05-06 20:45:00.135 8966-8966/kim.hsl.a7_zip I/MainActivity: Blocks = 1 2021-05-06 20:45:00.135 8966-8966/kim.hsl.a7_zip I/MainActivity: Everything is Ok 2021-05-06 20:45:00.135 8966-8966/kim.hsl.a7_zip I/MainActivity: Folders: 13 2021-05-06 20:45:00.135 8966-8966/kim.hsl.a7_zip I/MainActivity: Files: 6 2021-05-06 20:45:00.135 8966-8966/kim.hsl.a7_zip I/MainActivity: Size: 5965824 2021-05-06 20:45:00.135 8966-8966/kim.hsl.a7_zip I/MainActivity: Compressed: 309075 2021-05-06 20:45:00.135 8966-8966/kim.hsl.a7_zip I/MainActivity: 解壓縮文件 , 執(zhí)行完畢 , exitValue = 0 2021-05-06 20:45:00.135 8966-8966/kim.hsl.a7_zip I/octopus: 7zTypes SZ_OK = 0四、參考資料
參考資料 :
- 7-Zip 官網(wǎng) : https://www.7-zip.org/
Android NDK 編譯構(gòu)建腳本參考文檔 :
- ndk-build 腳本 : https://developer.android.google.cn/ndk/guides/ndk-build
- Android.mk 構(gòu)建腳本 : https://developer.android.google.cn/ndk/guides/android_mk
- Application.mk 構(gòu)建腳本 : https://developer.android.google.cn/ndk/guides/application_mk
博客資源 : 源碼 , 編譯后的可執(zhí)行文件, 在 7zip\p7zip_16.02\CPP\ANDROID\7zr\libs\ 目錄下 ;
- 下載地址 : https://download.csdn.net/download/han1202012/18215890
- GitHub 項目源碼 : https://github.com/han1202012/7-Zip
總結(jié)
以上是生活随笔為你收集整理的【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 测试 lib7zr.so 动态库调用 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 安装包优化】使用 li
- 下一篇: 【错误记录】Android 中调用 Pr