Windows NDK 编译openssl

关于NDK 编译openssl,网上找了不少文章,比如:
《在windows上编译openssl供Android NDK使用》

大都是基于这个github上的项目编译NDK openssl:
https://github.com/guardianproject/openssl-android

我也照着上面的文章顺利编译出了目标代码,但是因为编译出来的代码不是标准的安装目标结构,由于我需要用CMAKE交叉编译,所以这个项目编译出来的目标代码对于我并不方便使用。所以我自己下载了openssl的源码,并根据源码写出了linux bash交叉编译脚本。在windows下基于git bash控制台就可以顺利编译并安装到指定的文件夹下。以下是实现脚本。

完整的脚本参见码云上的openssl-ndk仓库

https://gitee.com/l0km/openssl-ndk.git

ndk-build.sh

#!/bin/bash
# NDK下交叉编译openssl 库
# 如果不指定默认编译 OpenSSL_1_1_1d 版本
# 编译要求: git perl
# NDK版本要求 16 及以下

sh_folder=$(dirname $(readlink -f $0))

# 目标平台
[ -z "$ANDROID_ABI" ] && ANDROID_ABI=armeabi-v7a

if [ "$ANDROID_ABI" = "armeabi" ]
then
  compiler_folder=arm-linux-androideabi-4.9
  ANDROID_API=14
  toolset=android-armeabi
elif [ "$ANDROID_ABI" = "armeabi-v7a" ]
then
  compiler_folder=arm-linux-androideabi-4.9
  ANDROID_API=14
  toolset=android-arm
elif [ "$ANDROID_ABI" = "arm64-v8a" ]
then
  compiler_folder=aarch64-linux-android-4.9
  ANDROID_API=21
  toolset=android-arm64
elif [ "$ANDROID_ABI" = "x86" ]
then
  compiler_folder=x86-4.9
  ANDROID_API=14
  toolset=android-x86
elif [ "$ANDROID_ABI" = "x86_64" ]
then
  compiler_folder=x86_64-4.9
  ANDROID_API=21
  toolset=android-x86_64
else
  echo "Invalid Android ABI: ${ANDROID_ABI}." 
  exit 255
fi
compiler_path=$ANDROID_NDK/toolchains/$compiler_folder/prebuilt/$buildPlatform/bin
[ ! -d "$compiler_path" ] && echo "ERROR:invalid compiler path $compiler_path for ANDROID_ABI=$ANDROID_ABI"  && exit 255
export PATH=$compiler_path:$PATH

# openssl 源码位置
[ -z "$OPENSSL_FOLDER" ] && OPENSSL_FOLDER=$sh_folder/openssl
# openssl 版本号
[ -z "$TAG" ] && TAG=OpenSSL_1_1_1d
# 安装路径
[ -z "$PREFIX" ] && PREFIX=$sh_folder/dist/openssl_android/$ANDROID_ABI
# 编译选项
[ -z "$OPTIONS" ] && OPTIONS="shared no-asm no-ssl2 no-ssl3 no-comp no-hw no-engine"

pushd $OPENSSL_FOLDER || exit 
if [ "$OPENSSL_FOLDER" = "$sh_folder/openssl" ]
then
    git checkout $TAG || exit 
fi
./Configure $toolset -D__ANDROID_API__=$ANDROID_API $OPTIONS --prefix=$PREFIX || exit 
make clean || exit
make -j8 && make install

popd
使用NDK编译OpenSSL的方法如下: 1. 下载OpenSSL源代码和NDK。 2. 将OpenSSL源代码解压到一个目录下,比如 `~/openssl-1.1.1g`。 3. 在 `~/openssl-1.1.1g` 目录下创建一个名为 `Application.mk` 的文件,文件内容如下: ``` APP_ABI := armeabi-v7a APP_PLATFORM := android-21 ``` 其中 `APP_ABI` 表示编译的目标平台,这里选择 `armeabi-v7a`;`APP_PLATFORM` 表示使用的Android版本,这里选择 `android-21`。 4. 在 `~/openssl-1.1.1g` 目录下创建一个名为 `Android.mk` 的文件,文件内容如下: ``` LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := openssl LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/crypto/*.c) LOCAL_SRC_FILES += $(wildcard $(LOCAL_PATH)/ssl/*.c) LOCAL_C_INCLUDES := $(LOCAL_PATH)/include LOCAL_CFLAGS := -DOPENSSL_NO_ASM -DOPENSSL_ANDROID LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES) include $(BUILD_SHARED_LIBRARY) ``` 其中 `LOCAL_MODULE` 表示生成的库文件名,这里设为 `openssl`;`LOCAL_SRC_FILES` 表示需要编译的源文件;`LOCAL_C_INCLUDES` 表示头文件路径;`LOCAL_CFLAGS` 表示编译选项,这里禁用汇编和启用Android特有的宏定义;`LOCAL_LDLIBS` 表示链接库,这里链接 `liblog.so`。 5. 在终端中进入 `~/openssl-1.1.1g` 目录,执行以下命令: ``` $ export NDK_HOME=/path/to/ndk $ $NDK_HOME/ndk-build ``` 其中 `/path/to/ndk` 是NDK的安装路径。执行完毕后,在 `~/openssl-1.1.1g/libs/armeabi-v7a` 目录下会生成 `libopenssl.so` 文件。 6. 将 `libopenssl.so` 文件复制到Android工程的 `libs/armeabi-v7a` 目录下。 7. 在Android工程的 `build.gradle` 文件中添加以下代码: ``` android { // ... sourceSets { main { jniLibs.srcDirs = ['libs'] } } } ``` 这样就可以在应用中使用OpenSSL库了。 注意:在使用OpenSSL时,需要在AndroidManifest.xml文件中添加以下权限: ``` <uses-permission android:name="android.permission.INTERNET" /> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值