github 仓库7zip-android
我在7-Zip 23.01 (2023-06-20) 的基础上加上了交叉编译脚步。以此让7zip命令行工具可以在 Android 通过ndk调用来执行。
需要注意 UnRAR 项目的协议,如果你不需要处理rar格式,在脚本中禁用即可。
下载源码
首先去官网下载7zip源码,然后可以先看看官方的 DOC/readme.txt
。里边说明了许多编译参数的作用以及协议说明。
修改脚本
在 CPP/7zip/Bundles/Alone2/makefile.gcc
文件中添加下面的内容。定义这个变量是因为 DEF_FILE
这样才能够生成出动态链接库。
DEF_FILE = 7zz # 变量具体的值可以自由改
删除 CPP/7zip/7zip_gcc.mak
里的所有 -Werror
参数,因为编译时会有许多警告,这个参数会将警告升级为报错,导致无法成功编译。
在 CPP/7zip/7zip_gcc.mak
的 152 行,删除 -lpthread
参数。
参考 Cannot find -lpthread (google.com).
删除之后像下边这样
LIB2 = -ldl
在 CPP/7zip/7zip_gcc.mak
文件的底部,添加下面的内容,用来将生成的动态链接库文件放到指定位置
android-install:
install $(O)/$(PROG)$(SHARED_EXT) $(Output)
编写编译脚步
在源码的根目录下创建一个 shell 脚步文件,写入下面的内容
# 根据实际情况更改路径
NDK=/path/to/your/ndk
# 这部分摘自 Android NDK 官方文档,主要是配置工具链和相关参数
# Only choose one of these, depending on your build machine...
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
# export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
# Only choose one of these, depending on your device...
export TARGET=aarch64-linux-android
# export TARGET=armv7a-linux-androideabi
# export TARGET=i686-linux-android
# export TARGET=x86_64-linux-android
export API=21
arch=arm64-v8a
# arch=armeabi-v7a
# arch=x86
# arch=x86-64
# 设置输出目录
export Output=$(pwd)/output/$arch
mkdir -p $Output
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
export LD=$TOOLCHAIN/bin/ld
# 参考 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=260329#c13
# 这里只添加了armv8-a版本的参数,其他架构自己解决
if [ "$TARGET" == "aarch64-linux-android" ]; then
export MY_ARCH="-march=armv8-a+crc+crypto"
fi
cd CPP/7zip/Bundles/Alone2
make -j -f makefile.gcc clean
make -j -f makefile.gcc
make -j -f makefile.gcc android-install
最后执行脚本,动态链接库文件会生成在 Output
变量对应的目录下
NDK 中使用
NDK 的使用可以参考其他教程。在代码中,使用函数 int Main2(int argc, char *argv[])
就可以调用 7zip 命令行工具了,跟在本地执行基本没有什么区别。