android开发编译openssl源代码生成libcrypto.so和libssl.so两个动态库用于android ndk项目开发使用
openssl编译
本篇文章的操作是在Linux环境之下,在虚拟机ubuntu 20版本上操作的步骤
1. openssl下载解压tar包
-
openssl下载地址:https://openssl-library.org/source/
-
下载完解压:
tar -zxvf openssl-3.3.2.tar.gz
// 我这里下载openssl-3.3.2.tar.gz版本
2. 编译openssl库,得到libcrypto.so和libssl.so两个so库
-
来到openssl目录下:
cd /home/ubuntu20/documents/openssl/openssl-3.3.2
-
源代码目录openssl-3.3.2下有NOTES-ANDROID.md说明文档,有详细的Android配置环境和编译命令说明
-
配置ndk环境,我这里使用的ndk版本是21.4.7075529:
export ANDROID_NDK_ROOT=/home/ubuntu20/Android/Sdk/ndk/21.4.7075529
PATH=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$PATH
- 32位编译命令:
./Configure android-arm -D__ANDROID_API__=21
make clean //先清除之前的构建产物
make //执行完成之后在openssl-3.3.2目录下生成libcrypto.so和libssl.so两个so库和两个a库
- 64位编译命令:
/Configure android-arm64 -D__ANDROID_API__=21
make clean //先清除之前的构建产物
make //执行完成之后在openssl-3.3.2目录下生成libcrypto.so和libssl.so两个so库和两个a库
3. 将libcrypto.so和libssl.so两个so库整合到android ndk项目
- 创建一个android ndk项目,然后将libcrypto.so和libssl.so两个so库以及include文件拷贝到项目里,配置如下截图所示
# CMakeLists.txt添加的内容
message("hello,1234")
#PROJECT_SOURCE_DIR==D:/work/androidcpp/app/src/main/cpp
include_directories("${PROJECT_SOURCE_DIR}/submodule/openssl3.3.2/include")
#CMAKE_SOURCE_DIR==D:/work/androidcpp/app/src/main/cpp
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}")
target_link_libraries(${CMAKE_PROJECT_NAME}
crypto
ssl
log)
// build.gradle的写法
android {
defaultConfig {
externalNativeBuild {
cmake {
cppFlags += "-std=c++11"
}
}
ndk {
abiFilters.clear()
abiFilters.addAll(arrayOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")) //这里指定的是源代码编译要支持编译出哪些架构的so库,一般支持"armeabi-v7a", "arm64-v8a"两个即可
}
}
buildTypes {
debug {
ndk {
abiFilters.clear()
abiFilters.addAll(arrayOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")) //这里指定的是debug打包时要打包哪些架构的so库进apk里面,一般支持"armeabi-v7a", "arm64-v8a"两个即可
}
isMinifyEnabled = false
}
release {
ndk {
abiFilters.clear()
abiFilters.addAll(arrayOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")) //这里指定的是release打包时要打包哪些架构的so库进apk里面,一般支持"armeabi-v7a", "arm64-v8a"两个即可
}
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
)
}
}
externalNativeBuild {
cmake {
path = file("src/main/cpp/CMakeLists.txt")
version = "3.22.1"
}
}
}