参考文章
https://zhuanlan.zhihu.com/p/69343040
1,什么是交叉编译
交叉编译是在一个平台上生成另一个平台上的可执行代码。所以我们在Linux上编译出可以在arm平台上使用的so库就是属于交叉编译。
2,系统环境
ubuntu18.04
ndk -> r21
3,在ndk 19以前 都是需要自己创建个交叉编译工具链
如使用ndk 19以后直接跳过
如下:
1,将NDK下载解压,并设置NDK_HOME的环境变量将NDK下载解压,并设置NDK_HOME的环境变量
export NDK_HOME=/home/zzz/android-ndk-r10e
export PATH=$NDK_HOME:$PATH
2,创建make_toolchain.sh 脚本并将一下内容复制到文件中保存,执行脚本,执行完成之后会在用户的根目录下生成一个android-toolchain的文件夹,内部有arm和arm64两个文件夹
export NDK_HOME=/home/zzz/android-ndk-r10e
platform=android-21
shmake=$NDK_HOME/build/tools/make-standalone-toolchain.sh
archs=(
'arm'
'arm64'
)
toolchains=(
'arm-linux-androideabi-4.9'
'aarch64-linux-android-4.9'
)
echo $NDK_HOME
num=${#archs[@]}
for ((i=0;i<$num;i++))
do
sh $shmake --arch=${archs[i]} --platform=$platform --install-dir=$HOME/Android/android-toolchain/${archs[i]} --toolchain=${toolchains[i]}
done
运行
bash make_toolchain.sh
成功后则构建完成
4,ndk使用19及其以上版本则直接使用ndk里面的工具链
export HOST_TAG=linux-x86_64
export TOOLCHAIN=/home/caizw/androidndk/android-ndk-r21/toolchains/llvm/prebuilt/$HOST_TAG
export AR=/home/caizw/androidndk/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar
export AS=/home/caizw/androidndk/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-as
export RANLIB=$TOOLCHAIN/bin/aarch64-linux-android-ranlib
export CC=/home/caizw/androidndk/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang
export CXX=/home/caizw/androidndk/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang++
export LD=/home/caizw/androidndk/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ld
export STRIP=/home/caizw/androidndk/ndroid-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-strip
此处可以看出我使用的ndk 为r21。而aarch64开头,则代表构建arm64位的
如需使用arm32位,则可以将aarch64-linux-android 改为 rm-linux-androideabi 。
export HOST_TAG=linux-x86_64
export TOOLCHAIN=/home/caizw/androidndk/android-ndk-r21/toolchains/llvm/prebuilt/$HOST_TAG
export AR=/home/caizw/androidndk/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar
export AS=/home/caizw/androidndk/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-as
export RANLIB=$TOOLCHAIN/bin/arm-linux-androideabi-ranlib
export CC=/home/caizw/androidndk/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi21-clang
export CXX=/home/caizw/androidndk/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi21-clang++
export LD=/home/caizw/androidndk/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ld
export STRIP=/home/caizw/androidndk/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip
如直接复制到终端,则对当前终端有效,当终端关闭在这里插入图片描述时需要重新复制