一、NDK独立工具链编译安装
本人使用的是CentOS linux,ndk 版本为 android-ndk-r16b,我使用的是root用户
1、下载linux版本NDK android-ndk-r16b-linux-x86_64.zip , 上传解压到/home/android-ndk-r9d
2、设置环境变量,为了使每个用户都能使用这个工具链,环境变量设置到 /etc/profile中
export ANDROID_NDK=/home/android-ndk-r16b
export TOOLCHAIN=/home/cross_tool/AndroidToolChain
export NDK_CROSS=/home/cross_tool/AndroidToolChain/bin
PATH=$PATH:$ANDROID_NDK:$NDK_CROSS
环境变量可根据用户实际情况填写,ANDROID_NDK 为NDK的安装目录,TOOLCHAIN 为工具链的安装目录, NDK_CROSS为工具链进程所在目录;
3、编译独立工具链
/home/android-ndk-r16b/build/tools/make-standalone-toolchain.sh --platform=android-21 --toolchain=arm-linux-androideabi-4.8 --arch=arm --install-dir=/home/cross_tool/AndroidToolChain
编译后,工具链安装在/home/cross_tool/AndroidToolChain目录中
二、使用该工具链移植开源项目,这里以openssl为例
本人使用的版本为openssl-1.1.0e,开始使用openssl-1.1.1-pre8版本出现问题,./Configure 就报错,没有搞定。
1、下载软件包,创建编译环境
创建ssl_android用户,shell使用bash,下载openssl-1.1.0e.tar.gz,解压中新建目录
2、设置编译器环境变量(修改 .bashrc文件)
export CROSS_SYSROOT=$TOOLCHAIN/sysroot
export TOOL=arm-linux-androideabi
export CC=$TOOLCHAIN/bin/${TOOL}-gcc
export CXX=$TOOLCHAIN/bin/${TOOL}-g++
export LINK=${CXX}
export LD=$TOOLCHAIN/bin/${TOOL}-ld
export AR=$TOOLCHAIN/bin/${TOOL}-ar
export RANLIB=$TOOLCHAIN/bin/${TOOL}-ranlib
export STRIP=$TOOLCHAIN/bin/${TOOL}-strip
export ARCH_FLAGS="-mthumb"
export ARCH_LINK=
export CFLAGS="${ARCH_FLAGS}-fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64"
export CXXFLAGS="${CFLAGS}-frtti -fexceptions"
export LDFLAGS="${ARCH_LINK}"
3、配置,编译
./Configure android --prefix=/build/ssl_android/openssl no-asm no-unit-test
make
编译时遇到了问题,出现了部分未定义符号,如 stderr strin signal tcgetattr tcsetattr
百度一遍,好像是说NDK的工具链中不支持这些函数和变量,好在函数不多,并且都是打印debug信息时用的,并且我也不需要openssl命令行工具,只需要so就可以了,就写了几个空函数先规避。
这几个函数编译时是OK的,但是连接时报错,说明里面的头文件还是有的,为啥没有定义没搞明白,难道需要手动引入其他的库?有大神知道还请不吝赐教。