android交叉编译C++代码

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

  1. 因为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/
  1. 直接执行 ./build.sh
  2. 编译成功会在./build/arm64-v8a目录下会有头文件和库文件

2.2 编译 spdlog

  1. 直接执行 ./build.sh
  2. 编译成功会在./build/arm64-v8a目录下会有头文件和库文件

2.3 编译SQLite

  1. 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 "---------------------------"
  1. 编译成功会在./build/目录下会有头文件和库文件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值