Android ndk 方式交叉编译boost库

最近公司项目重构,打算用统一的通讯库,控制器的原来的通讯使用的boost,所以打算在安卓这端通过jni的方式直接调用封装好的so类型的库;可能搞安卓的人很少遇到boost这个东西,一套c++的通讯库(当然不止通讯)这里附上官方链接boost;

原有的库的编译平台是linux,官方也提供了编译工具;在压缩包解压就能看到对应平台文件脚本;但是从linux(windows)编译安卓平台需要的so库文件需要使用交叉编译。相关资料十分有限,这里提供给大家我最后使用的方法;

linux平台下:

下载linux平台下的ndk工具,选择你想要的版本,我这里选用的是ndk21;下载链接下载链接。

然后解压缩,配置linux的环境变量:

export   NDK=/home/atom/ndk65_21/android-ndk-r21e-linux-x86_64/android-ndk-r21e
export   PATH=${PATH}:$NDK

配置环境后,刷新或者重启一下,然后下载交叉编译工具boost for android;

linux下执行build-android.sh脚本;

./build-android.sh $NDK//刚才设置的环境变量

这个工具在编译的时候会自动下载最新版本的boost库,默认编译成静态库;如果需要选择特定版本,在执行的时候配置参数:

./build-android.sh --boost= $NDK//刚才设置的环境变量

如果需要编译成so动态库,打开脚本找到:link = static;static改成shared

编译完成后窗口会有提示,输出路径等信息;

除此之外还可以自己配置编译脚本,但是我操作这种方式失败了,把脚本贴到下边;欢迎各位讨论交流:

#!/bin/bash

if [ -z "$ANDROID_NDK_ROOT" ]; then
    echo "ANDROID_NDK_ROOT environment variable not set, exiting."
    exit 1
fi

if [ -z "$BOOST_ROOT" ]; then
    echo "BOOST_ROOT environment variable not set, exiting."
    exit 1
fi

ABI="arm64-v8a"
TOOLCHAIN="$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64"
SYSROOT="$TOOLCHAIN/sysroot"
TARGET="aarch64-none-linux-android"
API_LEVEL="21"

export PATH="$TOOLCHAIN/bin:$PATH"
export CC="$TARGET$API_LEVEL-clang"
export CXX="$TARGET$API_LEVEL-clang++"
export LD="$TARGET-ld"
export AR="$TARGET-ar"
export AS="$TARGET-as"
export RANLIB="$TARGET-ranlib"
export STRIP="$TARGET-strip"
export CPPFLAGS="--sysroot=$SYSROOT"
export CXXFLAGS="--sysroot=$SYSROOT"
export LDFLAGS="--sysroot=$SYSROOT"

cd $BOOST_ROOT
./bootstrap.sh
./b2 --build-dir=build/$ABI --stagedir=stage/$ABI --prefix=install/$ABI --toolset=clang --threading=multi --link=shared --runtime-link=shared  --target-os=android --without-python cxxflags="-fPIC $CXXFLAGS" 
    linkflags="-llog -fPIC $LDFLAGS" install

你可能感兴趣的:(android)