Ubuntu 交叉编译 OpenSSL,并在 Android 中使用
来源:互联网 发布:deepin linux安装g 编辑:程序博客网 时间:2024/05/22 08:21
编译环境是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.a 和 libssl.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
- Ubuntu 交叉编译 OpenSSL,并在 Android 中使用
- 在ubuntu上编译和交叉编译OpenSSL库
- openssl 交叉编译到android
- 在VC中编译和使用OpenSSL
- 在VC中编译和使用OpenSSL
- 在VC中编译和使用OpenSSL
- 在VC中编译和使用OpenSSL
- 在VC中编译和使用OpenSSL
- openssl 在arm下的 交叉编译
- openssl在arm下的交叉编译
- Ubuntu系统下为Android工程交叉编译基于源码的OpenSSL库
- Ubuntu使用日志2(在Eclipse中搭建C++交叉编译环境)
- 交叉编译openssl及openssl工具的使用
- 在Ubuntu上交叉编译Android libevent库
- 如何在ubuntu中搭建交叉编译环境
- openssl交叉编译
- openssl交叉编译
- 交叉编译openssl
- 对字符串进行阴影处理---swift3
- java集合操作的包装类Collections(包含集合的排序)
- 多台web服务器之间共享Session
- redis发布、订阅
- java字符串的替换replace、replaceAll、replaceFirst的区别详解
- Ubuntu 交叉编译 OpenSSL,并在 Android 中使用
- 协同过滤推荐算法详解
- 超级吊的ExpandableListView三级目录
- HI3520D音频
- vue入门
- 如何给webApp应用添加动态水印?并且不影响页面的交互事件
- securecrt 远程映射端口
- 高准确率声学模型基于决策树的状态聚类
- JavaScript中对Object.defineProperty 函数 的理解