编译环境是Ubuntu,写这个说明的时刻,最新的 NDK 版本是 15,OpenSSL 版本是 1.1.1e

1. 准备编译脚本

到 https://github.com/leenjewel/openssl_for_ios_and_android 下载别人写好的编译环境配置脚本

我们用得到的是 _shared.sh 和 build-openssl4android.sh

build-openssl4android.sh 中,默认的OpenSSL 版本是 1.0.2k,改成最新的1.1.1e

-LIB_NAME="openssl-1.0.2k"
-LIB_NAME="openssl-1.1.1e"

脚本会自动下载 openssl 1.1.1e,需要有curl

替换掉这个文件中所有的 android-armv7,替换为 android-armeabi
默认只编译静态库,如果想要动态库,修改下面这里,删掉 no-shared \

  ./Configure $ARCH \              --prefix=${LIB_DEST_DIR}/${ABI} \              --with-zlib-include=$SYSROOT/usr/include \              --with-zlib-lib=$SYSROOT/usr/lib \              zlib \              no-asm \              no-shared \              no-unit-test


2. 配置NDK

修改环境变量

sudo gedit /etc/profile

添加

export ANDROID_NDK=/home/yangming/Develop/Android/Sdk/ndk-bundle

使之生效

source /etc/profile

非常关键的一点,打开 NDK 路径中 ndk-bundle/build/tools/make-standalone-toolchain.sh,找到

run python `dirname $0`/make_standalone_toolchain.py \    --arch $ARCH $PLATFORM_ARG --stl $STL $INSTALL_ARG $FORCE_ARG

在结尾加上一句 –deprecated-headers

run python `dirname $0`/make_standalone_toolchain.py \    --arch $ARCH $PLATFORM_ARG --stl $STL $INSTALL_ARG $FORCE_ARG --deprecated-headers

如果使用 NDK15,不加这句话就会在编译的时候失败,输出如下

..../libcrypto.so: error: undefined reference to 'stderr'./libcrypto.so: error: undefined reference to 'stdin'./libcrypto.so: error: undefined reference to 'signal'./libcrypto.so: error: undefined reference to 'tcsetattr'./libcrypto.so: error: undefined reference to 'tcgetattr'collect2: error: ld returned 1 exit statusmake[2]: *** [link_app.gnu] Error 1make[2]: Leaving directory `/home/yangming/Develop/Projects/openssl_for_ios_and_android/tools/openssl-1.1.0e`make[1]: *** [fuzz/asn1-test] Error 2make[1]: *** Waiting for unfinished jobs.......

关于这个问题的讨论在这里 https://github.com/openssl/openssl/issues/3826

3. 生成 android-toolchain

实际上 _shared.sh就会自动生成 android-toolchain,但是我们不使用脚本生成的,终端进入 openssl_for_ios_and_android/tools,输入

$ANDROID_NDK/build/tools/make-standalone-toolchain.sh --platform=android-14 --toolchain=arm-linux-androideabi-4.9 --install-dir=`pwd`/armeabi-v7a-android-toolchain

生成 armeabi-v7a-android-toolchain 文件夹

4. 编译

终端输入

./build-openssl4android.sh android-armeabi

编译结束后会看到生成了 libs 文件夹,头文件在 /openssl_for_ios_and_android/tools/libs/armeabi-v7a/include,库文件在 /openssl_for_ios_and_android/tools/libs/armeabi-v7a/lib/

5. 建立 Android 工程

android studio 新建 Android 工程 OpenSSLDemo,勾选 “Include C++ support”

将刚刚生成的静态链接库 libcrypto.alibssl.a 拷到 /OpenSSLDemo/app/src/main/jniLibs/armeabi-v7a

头文件 include 拷到 /OpenSSLDemo/app/src/main/cpp/include

6. 修改 CMakeLists.txt

声明头文件位置

include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/include)

添加静态链接库,并声明库位置

add_library(crypto STATIC IMPORTED)set_target_properties(crypto  PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libcrypto.a)add_library(ssl STATIC IMPORTED)set_target_properties(ssl  PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libssl.a)

链接

target_link_libraries( # Specifies the target library.                       openssl-jni                       z                       ssl                       crypto                       # Links the target library to the log library                       # included in the NDK.                       ${log-lib} )

注意那个 z,libz 是必须的依赖

到此为止,OpenSSL 已经添加进了 Android 工程中,可以开始编码了


Demo :
http://git.oschina.net/wandererparsifal/openssldemo

更多相关文章

  1. Android(安卓)使用SWIG生成Jni代码
  2. Android+NDK+OpenGLES开发环境配置
  3. android 在源码中编译工程的方法
  4. Android(安卓)平台下使用 i2c-tools
  5. HockeyApp环境搭建
  6. cocos2d-x 3.16 Lua android studio 打包过程记录
  7. android coredump 调试
  8. 【OpenCV】编译opencv+opencv_contrib sdk for android(附编译好
  9. AS 配置使用NDK

随机推荐

  1. php之session实战
  2. mysql之pdo预处理与sql防注入
  3. 微软在ARM上成功移植OpenJDK for Windows
  4. 技术造成歧视?微软等巨头不为警方提供面部
  5. 全新设计的Xcode 12
  6. VS Code的Golang插件现在由Go团队维护
  7. 从Java EE到Jakarta EE,最终过渡版本发布
  8. 马化腾每天刷题?代码你打算写到几岁?
  9. GNOME Mutter的代码清理工作将促进支持Vu
  10. 又说骚话,Linus再次拒绝Intel CPU漏洞补丁