文章目录

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

前置博客 :

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

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


在上一篇博客 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程中 | 配置 CMakeLists.txt 构建脚本 ) 中 , 将 lib7zr.so 动态库需要的头文件都拷贝到了 Android Studio 工程中 , 并配置了 CMakeLists.txt 构建脚本 ;

本篇博客开发 JNI 类 , 验证 lib7zr.so 动态库 ;

在 【Android 安装包优化】Android 中使用 7zr 可执行程序 解压缩文件 博客的 Android 项目的基础上进行开发 ;

首先加载 libnative-lib.so 动态库 , 这是 CMakeLists.txt 编译出来的动态库 , 声明 native 方法 ;

class MainActivity : AppCompatActivity() {companion object {init {System.loadLibrary("native-lib")}}external fun executeCmd(cmd: String): Unit
}

在 JNI 层的 C++ 文件中实现上述 native 方法 , MainActivity 类的包名是 kim.hsl.a7_zip , 因此 executeCmd 方法对应的 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 文件拷贝到应用私有目录*/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}")// 查看该文件是否存在, 如果存在设置该文件可执行// 如果不存在 , 拷贝文件if (exeFile.exists()) {exeFile.setExecutable(true)Log.i(TAG, "内置存储空间存在该 /data/user/0/kim.hsl.a7_zip/files/7zr 文件")return} else {Log.i(TAG, "内置存储空间不存在 7zr 可执行文件 , 开始拷贝文件")}// 如果不存在 , 拷贝文件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 架构拷贝不同的可执行程序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 文件结束")}/*** 使用 7zr 进行压缩*/fun compress7z() {// /data/user/0/kim.hsl.a7_zip/files/7zrvar exeFile = File(filesDir, "7zr")// 执行前赋予可执行权限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)// 读取命令执行过程数据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, "压缩文件 , 执行完毕 , exitValue = $exitValue")}/*** 判定命令是否执行完毕* 调用 process.exitValue 方法 , 如果没有执行完毕 , 会抛异常,* 如果执行完毕会返回一个确定的值*/fun isComplete(process: Process): Boolean {try {// 已经执行完毕process.exitValue()return true} catch (e: IllegalThreadStateException) {// 未执行完毕return false}}/*** 使用 7zr 进行解压缩*/fun uncompress7z() {// /data/user/0/kim.hsl.a7_zip/files/7zrvar exeFile = File(filesDir, "7zr")// 执行前赋予可执行权限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)// 读取命令执行过程数据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, "解压缩文件 , 执行完毕 , exitValue = $exitValue")}/*** 递归删除文件*/fun recursionDeleteFile(file: File) {if (file.isDirectory) {// 如果是目录 , 则递归删除file.listFiles().forEach {// ForEach 循环删除目录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_H

4、执行结果

执行结果 :

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: 内置存储空间存在该 /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: 压缩文件 , 执行完毕 , 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: 解压缩文件 , 执行完毕 , exitValue = 0
2021-05-06 20:45:00.135 8966-8966/kim.hsl.a7_zip I/octopus: 7zTypes SZ_OK = 0

四、参考资料


参考资料 :

  • 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 动态库调用 )相关推荐

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

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

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

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

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

    文章目录 一.拷贝 p7zip 源码中的头文件到 Android Studio 项目中 二.配置 CMakeLists.txt 构建脚本 1.导入动态库 2.导入头文件 三.完整 CMakeLists ...

  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. MySQL中购买的语句,mysql操作语句 - 买灰机自己开的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. GPhone、OPhone、UPhone、APhone、IPhone:满城尽带XPhone
  3. 【英语天天读】第一场雪
  4. leetcode - 543. 二叉树的直径
  5. 关于分布式系统架构模块通讯方式选择的问题
  6. 大话数据结构 -07-1 图的定义、抽象数据类型与存储结构
  7. Powershell创建数组
  8. Python下APScheduler的快速指南
  9. pdf内容怎么复制到word文档里_PDF转Word要收费?这4种免费实用的方法送你,一分钟统统能搞定...
  10. BZOJ 3190: [JLOI2013]赛车
  11. 宝峰c1对讲机写频软件_宝峰写频软件-宝峰对讲机写频软件 附USB线驱动 7.01 官方版 - 河东下载站...
  12. solidworks模板文件_教你如何快速制作工程图模板
  13. thinkphp 实现图片中的二维码识别
  14. java泛型笔记2--上界通配符
  15. 2022北京智源大会中关村昇腾人工智能产业分论坛:汇聚智慧星火 构建AI新生态...
  16. 手机直播连麦技术分析
  17. windows 指纹识别不可用
  18. Python中的Numpy、SciPy、MatPlotLib安装教程
  19. matlab使用LMI对二阶系统进行H无穷控制
  20. rtl8812au linux驱动下载,RTL8812AU_linux_v4.3.20_16317_20160108

热门文章

  1. CCNP自学之路——eigrp--1
  2. SAP BPC最佳实践-如何配置和使用BPC的钻取Drill through
  3. linux ssh密钥认证
  4. 创建带有关联的 XML 架构的 XML 文件 从 XML 文件创建 XML 架构
  5. Redis学习(2)-redis安装
  6. 架构漫谈读后感之软件架构师如何工作
  7. tensorflwo-gpu win10_64bit 的安装版本问题
  8. 城联数据TSM技术方案起底
  9. box_sizing
  10. 防雪崩利器:熔断器 Hystrix 的原理与使用