ubuntu 交叉编译android,Ubuntu 交叉编译 OpenSSL,并在 Android 中使用

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

1. 准备编译脚本

我们用得到的是 _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 status

make[2]: *** [link_app.gnu] Error 1

make[2]: Leaving directory `/home/yangming/Develop/Projects/openssl_for_ios_and_android/tools/openssl-1.1.0e`

make[1]: *** [fuzz/asn1-test] Error 2

make[1]: *** Waiting for unfinished jobs....

...

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 是必须的依赖

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值