# 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} 目录。" ```