Android交叉编译C++
1、前置条件
a.交叉编译工具:android-ndk-r23c (放在该目录下 /opt/ndk/
b.source 环境: source android_r23_arm-env
android_r23_arm-env文件内容如下:
#!/bin/bash
# export for ndk r23c
API_LEVEL="21"
export ANDROID_HOST=aarch64-linux-android
export ANDROID_BUILD=linux-x86_64
export ANDROID_ARCH=arm64
export ANDROID_NDK=/opt/ndk/android-ndk-r23c
export ANDROID_TOOLCHAIN_VERSION=4.9
export RANLIB=$ANDROID_HOST-ranlib
export TOOLCHAIN="$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64"
export SYSROOT=$TOOLCHAIN/sysroot
export CC="$ANDROID_HOST$API_LEVEL-clang "
export CXX="$ANDROID_HOST$API_LEVEL-clang++ "
export LD="$TOOLCHAIN/bin/ld "
export AR="$TOOLCHAIN/bin/llvm-ar"
export AS="$TOOLCHAIN/$ANDROID_HOST/bin/as"
export RANLIB="$TOOLCHAIN/bin/llvm-ranlib"
export STRIP="$TOOLCHAIN/bin/llvm-strip"
export CPPFLAGS="--sysroot=$SYSROOT"
export ARCH_FLAGS="-mthumb"
export CFLAGS="${ARCH_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector-all -fno-strict-aliasing"
export CXXFLAGS="${CFLAGS} -frtti -fexceptions"
export PATH="$TOOLCHAIN/bin:$PATH"
android_r21_arm-env文件内容如下(如果用的是21版本的ndk可以用这个,下面脚本source部分自行修改就行):
#!/bin/bash
export TOOLCHAIN=/opt/ndk/android-ndk-r21e/toolchains/llvm/prebuilt/linux-x86_64/
export CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang
export CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++
export TOOL=aarch64-linux-android
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 PATH=$TOOLCHAIN/bin:$PATH
export SYSROOT=$TOOLCHAIN/sysroot
export ARCH_FLAGS="-mthumb"
export CFLAGS="${ARCH_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector-all -fno-strict-aliasing"
export CXXFLAGS="${CFLAGS} -frtti -fexceptions"
编译脚本 build.sh(大部分可以直接使用)
#!/bin/bash
#根据实际目录修改
source "/opt/ndk/android_r23_arm-env"
# current dir
CURRENT_PATH=$(pwd)
#预留
TARGET=aarch64-linux-android
#按照需要的ABI进行修改
#TARGET_ABI=armeabi-v7a
TARGET_ABI=arm64-v8a
PREFIX=$CURRENT_PATH/build/$TARGET_ABI
if [ -d $PREFIX ];then
rm -rf $PREFIX
mkdir -p $PREFIX
else
mkdir -p $PREFIX
fi
echo "---------------------------"
echo " > start to build ARM64."
echo "---------------------------"
cd $CURRENT_PATH/build/
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
-DCMAKE_INSTALL_PREFIX=$PREFIX \
-DANDROID_ABI=$TARGET_ABI \
-DANDROID_PLATFORM=android-21 \
-DCMAKE_BUILD_TYPE=release\
-DANDROID_TOOLCHAIN=clang++ \
..
make -j 8
make install
echo "---------------------------"
echo " > build finished."
echo "---------------------------"
cd $CURRENT_PATH
2、编译第三方库
2.1 编译 protobuf_3_17
- 因为protobuf的CMakeLists.txt文件在 cmake 文件夹下,修改build.sh中的cmake部分标红如下:
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
-DCMAKE_INSTALL_PREFIX=$PREFIX \
-DANDROID_ABI=$TARGET_ABI \
-DANDROID_PLATFORM=android-21 \
-DCMAKE_BUILD_TYPE=Release\
-DANDROID_TOOLCHAIN=clang++ \
../cmake/
- 直接执行 ./build.sh
- 编译成功会在./build/arm64-v8a目录下会有头文件和库文件
2.2 编译 spdlog
- 直接执行 ./build.sh
- 编译成功会在./build/arm64-v8a目录下会有头文件和库文件
2.3 编译SQLite
- build.sh文件如下:
#!/bin/bash
source "/opt/ndk/android_r23_arm-env"
./configure --prefix=`pwd`/build/\
--with-sysroot=$TOOLCHAIN/sysroot \
--host=aarch64-linux-android
if [ $? -eq 0 ]; then
make -j8 && make install
fi
echo "---------------------------"
echo " > build finished."
echo "---------------------------"
- 编译成功会在./build/目录下会有头文件和库文件