# Android NDK 编译OpenSSL 3.2.5 方法
***
### 1. 安装依赖
首先,确保你的系统中安装了必要的工具和库。对于Ubuntu系统,你可以使用以下命令安装:
```bash
sudo apt-get update
sudo apt-get install build-essential
sudo apt-get install libssl-dev
sudo apt-get install perl
sudo apt-get install make
sudo apt-get install wget
sudo apt-get install curl
sudo apt-get install android-ndk
```
对于Mac,你可以使用Homebrew:
打开终端,运行以下命令来安装 Homebrew(如果你还没有安装的话):
```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
```bash
brew install openssl
brew install perl
brew install make
```
### 2: 下载 OpenSSL 源代码
访问 OpenSSL 的官方网站或 GitHub 页面下载 OpenSSL 3.2.5 的源代码。你可以使用 wget 或者 curl 命令:
```bash
wget https://www.openssl.org/source/openssl-3.2.5.tar.gz
#或者 curl 命令:
curl -L -O https://www.openssl.org/source/openssl-3.2.5.tar.gz
```
或者,使用浏览器下载后,将文件移动到你的工作目录中。
### 3: 解压源代码
解压下载的 tar.gz 文件:
```bash
tar -xzf openssl-3.2.5.tar.gz
cd openssl-3.2.5
```
### 4: 配置和编译环境 OpenSSL
为了在Android上编译OpenSSL,你需要指定Android NDK 的路径和目标架构。例如:
```bash
# 设置 Android NDK 路径
#需检查NDK安装路径下的工具链是否存在,并手动添加至PATH环境变量
export ANDROID_NDK_ROOT=~/Library/Android/sdk/ndk/29.0.14033849
#需检查NDK安装路径下的工具链是否存在,并手动添加至PATH环境变量
#需根据实际NDK版本调整路径
export PATH=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
#我的MACOSX 路径
export PATH=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/darwin-x86_64/bin:$PATH
#查看是否环境变量未生效
$PATH
#可以手动修改环境配置文件
#修改.bashrc或.zshrc后需执行source ~/.bashrc或重启终端使变更生效
# 配置 OpenSSL
# 配置命令(armv7架构示例)
./Configure android-arm
--prefix=$(pwd)/android-build \
--cross-compile-prefix=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/darwin-x86_64/bin/armv7a-linux-androideabi24- \
no-shared no-unit-test
```
>./Configure 是配置脚本。
>android-arm 表示目标架构。
>--cross-compile-prefix 指定 Android API 级别。
>no-shared 和 no-unit-test 表示不编译共享库和单元测试。
>交叉编译前缀必须完整匹配NDK目录结构,注意darwin-x86_64对应macOS系统
```bash
#如需编译其他架构替换参数为:
# 编译 arm64-v8a
./Configure android-arm64 --prefix=$(pwd)/android-build/arm64-v8a --cross-compile-prefix=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android24- no-unit-test
make clean && make -j4 && make install
# 编译 armeabi-v7a
./Configure android-arm --prefix=$(pwd)/android-build/armeabi-v7a --cross-compile-prefix=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/darwin-x86_64/bin/armv7a-linux-android24- no-unit-test
make clean && make -j4 && make install
# 编译 x86_64
./Configure android-x86_64 --prefix=$(pwd)/android-build/x86_64 --cross-compile-prefix=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/darwin-x86_64/bin/x86_64-linux-android24- no-unit-test
make clean && make -j4 && make install
# 编译 x86
./Configure android-i686 --prefix=$(pwd)/android-build/x86 --cross-compile-prefix=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android24- no-unit-test
make clean && make -j4 && make install
```
### 5: 编译和安装
一旦配置完成,就可以开始编译和安装了:
```bash
make clean # 清理之前的编译结果(可选)
make -j4 # 开始编译 其中 -j4 表示使用 4 个线程同时执行编译任务,以加快整体编译速度
make install # 安装到指定的目录 $(pwd)/android-build/{ARCH}
```
一旦编译完成,最终在android-build目录生成l<code>libcrypto.so</code>和<code>libssl.so</code>这两个库文件整合到你的 Android 项目中。你可以手动复制它们到项目的 <code>jniLibs</code> 目录中,或在 CMakeLists.txt 文件中添加它们的路径。
## NDK-Build 方式配置
在 Application.mk 中定义 APP_ABI:
```bash
APP_ABI := arm64-v8a armeabi-v7a x86_64
APP_PLATFORM := android-24
```
在 Android.mk 中加入so
```bash
LOCAL_LDLIBS += -ldl -llog -landroid -lz
LOCAL_SHARED_LIBRARIES := libcrypto libssl
LOCAL_EXPORT_LDLIBS := $(LOCAL_LDLIBS)
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libcrypto # 模块名
LOCAL_SRC_FILES := $(LOCAL_PATH)/libs/$(TARGET_ARCH_ABI)/libcrypto.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libssl
LOCAL_SRC_FILES := $(LOCAL_PATH)/libs/$(TARGET_ARCH_ABI)/libssl.so
include $(PREBUILT_SHARED_LIBRARY)
```
通过以上步骤,你应当能够成功在 Android 平台上编译 OpenSSL 并将其整合到你的项目中。虽然这个过程需要一定环境配置的知识,但随着经验的累积,你会发现这是一项非常有用的技能。祝你好运,期待你在 Android 开发中取得更大成就!
## 这里我提供一个macOSX 下编译脚本
```bash
#!/bin/bash
# 定义支持的架构
ARCHS=("arm64" "x86_64" "arm")
ANDROID_API="24"
OPENSSL_VERSION="3.2.5"
OPENSSL_OUTPUT=$(pwd)/android-build
#curl -L -O https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz
#curl -L -O https://github.com/openssl/openssl/releases/download/openssl-${OPENSSL_VERSION}/openssl-${OPENSSL_VERSION}.tar.gz
# 清理旧文件
rm -rf openssl-${OPENSSL_VERSION}
# 解压源码
tar -xzf openssl-${OPENSSL_VERSION}.tar.gz
cd openssl-${OPENSSL_VERSION}
# 创建输出目录
mkdir -p $OPENSSL_OUTPUT
# 设置 Android NDK 路径
#需检查NDK安装路径下的工具链是否存在,并手动添加至PATH环境变量
export ANDROID_NDK_ROOT=~/Library/Android/sdk/ndk/29.0.14033849
#需根据实际NDK版本调整路径
#export PATH=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
#我的MACOSX 路径
export PATH=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/darwin-x86_64/bin:$PATH
# 编译每个架构
for ARCH in ${ARCHS[@]}; do
case $ARCH in
"arm64")
PLATFORM=aarch64
ARCH_DIR=arm64-v8a
;;
"x86_64")
PLATFORM=x86_64
ARCH_DIR=x86_64
;;
"arm")
PLATFORM=armv7a
ARCH_DIR=armeabi-v7a
;;
esac
./Configure android-${ARCH} --prefix=${OPENSSL_OUTPUT}/${ARCH_DIR} --cross-compile-prefix=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/darwin-x86_64/bin/${PLATFORM}-linux-android${ANDROID_API}-
make -j$(sysctl -n hw.ncpu)
make install
make clean
# 拷贝
mkdir -p ../../JNI/libs/${ARCH_DIR}/
cp -f ${OPENSSL_OUTPUT}/${ARCH_DIR}/lib/libssl.so ../../JNI/libs/${ARCH_DIR}/libssl.so
cp -f ${OPENSSL_OUTPUT}/${ARCH_DIR}/lib/libcrypto.so ../../JNI/libs/${ARCH_DIR}/libcrypto.so
done
mkdir -p ../../include/openssl/
cp -rf ${OPENSSL_OUTPUT}/arm64-v8a/include/openssl/* ../../include/openssl
echo "编译完成!静态库已生成到 ${OPENSSL_OUTPUT} 目录。"
```