news 2026/7/5 3:36:32

在Ubuntu系统上为Android交叉编译OpenSSL

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
在Ubuntu系统上为Android交叉编译OpenSSL

在Ubuntu系统上为Android交叉编译OpenSSL(以OpenSSL 3.5.7为例)需要配置好Android NDK环境,并使用OpenSSL自带的配置脚本进行编译。

选取OpenSSL版本,可以在官网查看:https://openssl-library.org/source/,建议选择带有LTS标识的版本,为长期支持版。

在windows系统上配置Ubuntu系统虚拟机步骤详见上一篇文章,本文不再赘述。

以下是具体的步骤和示例脚本。

1. 准备工作

首先,更新Ubuntu系统的软件包列表并安装必要的构建工具:

sudoaptupdatesudoaptinstall-ybuild-essentialwgettarunzipmakeclang

2. 下载并配置 Android NDK

OpenSSL的交叉编译需要用到Android NDK。建议使用稳定版本(例如 NDK r25c 或 r26b)。

1. 下载 NDK(以 r25c 为例):

cd~wgethttps://dl.google.com/android/repository/android-ndk-r25c-linux.zip

2. 解压 NDK:

unzipandroid-ndk-r25c-linux.zip

3. 设置环境变量(你可以将其记录在临时变量中,或者写入~/.bashrc):

exportANDROID_NDK_HOME=$HOME/android-ndk-r25cexportANDROID_NDK_ROOT=$ANDROID_NDK_HOMEexportPATH=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH

永久写入环境变量具体操作步骤如下:

步骤 1:使用 nano 打开~/.bashrc文件

在终端中输入以下命令:

nano~/.bashrc
步骤 2:将环境变量添加到文件末尾

使用键盘上的下方向键一直滑到文件的最底部,然后在文件的最末尾,粘贴以下内容:

# Android NDK environment variablesexportANDROID_NDK_HOME=$HOME/android-ndk-r25cexportANDROID_NDK_ROOT=$ANDROID_NDK_HOMEexportPATH=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
步骤 3:保存并退出
  1. Ctrl + O保存。
  2. Enter确认文件名。
  3. Ctrl + X退出nano编辑器。
步骤 4:使配置立即生效

在当前终端运行以下命令,使刚刚修改的配置立即生效(不需要重启电脑或重新打开终端):

source~/.bashrc
验证是否成功

你可以运行以下命令来验证环境变量是否已正确配置:

echo$ANDROID_NDK_HOME

如果终端正确输出了/home/你的用户名/android-ndk-r25c(或者你的实际 NDK 路径),说明配置已经永久生效。今后每次你打开新的终端窗口,这些变量都会自动加载。

3. 下载 OpenSSL 源码

本文以 OpenSSL 3.5.7 (长期支持版本 LTS) 为例。

cd~wgethttps://www.openssl.org/source/openssl-3.5.7.tar.gztar-zxvfopenssl-3.5.7.tar.gzcdopenssl-3.5.7

4. 编写编译脚本

由于Android有不同的架构(如arm64-v8a,armeabi-v7a,x86_64,x86),编写一个自动化脚本可以方便地为这些架构生成预编译库。

openssl-3.5.7目录下创建一个名为build_android.sh的脚本:

nanobuild_android.sh

将以下内容复制到脚本中:

#!/bin/bash# 1. 显式指定你的 NDK 路径(请确保该路径与你实际解压的 NDK 路径一致)exportANDROID_NDK_ROOT=$HOME/android-ndk-r25cexportANDROID_NDK_HOME=$ANDROID_NDK_ROOT# 检查 NDK 路径是否存在if[!-d"$ANDROID_NDK_ROOT"];thenecho"Error: NDK directory not found at$ANDROID_NDK_ROOT"echo"Please check your NDK path in this script."exit1fi# 定义支持的架构和对应的OpenSSL配置名称ARCHS=("arm64-v8a""android-arm64""21""armeabi-v7a""android-arm""21""x86_64""android-x86_64""21""x86""android-x86""21")# 获取当前工作目录SRC_DIR=$(pwd)# 定义输出目录OUTPUT_DIR="${SRC_DIR}/android_build"# 将 NDK 工具链加入 PATHexportPATH=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH# 循环编译各个架构for((i=0;i<${#ARCHS[@]};i+=3));doABI=${ARCHS[i]}TARGET=${ARCHS[i+1]}API=${ARCHS[i+2]}echo"=========================================="echo"Building OpenSSL for${ABI}(API${API})..."echo"=========================================="# 清理之前的编译残留makeclean2>/dev/null# 创建输出路径PREFIX="${OUTPUT_DIR}/${ABI}"mkdir-p"${PREFIX}"# 配置 OpenSSL./Configure${TARGET}\-D__ANDROID_API__=${API}\--prefix="${PREFIX}"\--openssldir="${PREFIX}/ssl"\no-shared\no-tests# 编译并安装make-j$(nproc)makeinstall_swdoneecho"Build completed. Outputs are located in:${OUTPUT_DIR}"

5. 执行编译

1. 给脚本赋予执行权限:

chmod+x build_android.sh

2. 运行脚本:

./build_android.sh

6. 查看编译结果

编译完成后,预编译的文件会输出在openssl-3.5.7/android_build目录下。目录结构大致如下:

android_build/ ├── arm64-v8a │ ├── bin │ ├── include │ │ └── openssl │ └── lib │ ├── libcrypto.a │ └── libssl.a ├── armeabi-v7a │ ...
  • include/openssl:存放头文件,在 Android 项目(如 CMake)中配置target_include_directories时会用到。
  • lib:存放生成的静态库libcrypto.alibssl.a。如果在脚本配置中去掉了no-shared,此处还会生成libcrypto.solibssl.so

验证生成的文件

你可以运行以下命令来查看生成的预编译库文件结构:

ls-l/home/openclaw/openssl-3.5.7/android_build

你应该会看到生成了 4 个对应 Android 架构的文件夹。接着,你可以检查具体某个架构下的库文件是否存在(例如arm64-v8a):

ls-l/home/openclaw/openssl-3.5.7/android_build/arm64-v8a/lib/

如果在这个lib文件夹下看到了libcrypto.alibssl.a,说明这些就是你所需要的 Android 预编译静态库。

注意事项

  1. API Level: 脚本中设置的__ANDROID_API__21。如果你的应用需要支持更旧的设备,或者需要使用更新的系统特性,可以根据实际需求调整该值(例如2426等)。
  2. 动态库与静态库:
    • 默认脚本中开启了no-shared,这会生成静态库 (.a)。静态库便于打包,不易产生动态链接冲突。
    • 如果需要动态库 (.so),请从脚本的./Configure命令中移除no-shared行。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/5 3:35:45

题解:洛谷 B4556 [GESP202606 三级] 字符转换

【题目来源】 洛谷&#xff1a;B4556 [GESP202606 三级] 字符转换 - 洛谷 【题目描述】 小杨同学有一串字符&#xff0c;里面可能有&#xff1a; 大写字母&#xff0c;比如 AAA、BBB、CCC小写字母&#xff0c;比如 aaa、bbb、ccc数字&#xff0c;比如 000、111、222 现在小…

作者头像 李华
网站建设 2026/7/5 3:34:27

第一线 DYXnet:海外企业跨境网络建设,为什么更需要“云网安”一体化服务商?

随着中国企业出海节奏加快&#xff0c;海外办公室、海外工厂、跨境电商团队、国际物流网络和多区域业务系统正在成为企业数字化运营的新常态。对这些企业而言&#xff0c;跨境网络不再只是“能访问总部系统”的基础设施&#xff0c;而是直接影响业务效率、客户响应、数据安全和…

作者头像 李华
网站建设 2026/7/5 3:32:48

CountDownLatch 实现精准的并发控制

CountDownLatch 实现精准的并发控制 概述 本文档详细分析并发启动场景&#xff08;赛跑模式&#xff09;中两个 CountDownLatch 的作用和阻塞关系。代码示例 import java.util.concurrent.CountDownLatch;public class RaceStartDemo {public static void main(String[] args) …

作者头像 李华
网站建设 2026/7/5 3:31:58

商用烤盘定制厂家正规机构

做过烘焙供应链的都懂&#xff0c;商用烤盘是直接影响生产效率和产品品质的核心工具&#xff0c;尤其是有定制需求的食品加工厂、中央厨房&#xff0c;找对正规的烘焙器具定制厂家&#xff0c;能避开后续不少麻烦&#xff1a;比如定制尺寸和产线不匹配卡炉、用两三个月就变形翘…

作者头像 李华
网站建设 2026/7/5 3:31:22

从 OC 平滑迁移 Swift 完整方案

前言&#xff1a;重构不是推倒重来&#xff0c;是技术债务的有序偿还 对于大多数运行了5年以上的iOS大型项目来说&#xff0c;几十万行Objective-C代码沉淀了无数业务逻辑、边缘场景和经过亿级用户验证的稳定逻辑。直接全量重写为Swift的项目几乎无一例外都陷入了工期无限延期…

作者头像 李华
网站建设 2026/7/5 3:29:58

VIbe Coding时期,推送项目惹众宾欢也

在进行 vibe coding 时&#xff0c;容易在项目推送环节翻车&#xff0c;比如大家常调侃的将 API 密钥推送到仓库的情况。本文就为大家讲清楚 DeepSeek API 如何安全推送。摘要&#xff1a;本文详细介绍了在 vibe coding 过程中如何安全地将项目推送到 GitHub&#xff0c;避免泄…

作者头像 李华