使用ndk arm-linux-androideabi-clang ++编译器为Android构建grpc C ++

时间:2019-01-05 12:58:21

标签: android c++ build arm grpc

我正在尝试使用Android NDK CLANG编译器(arm-linux-androideabi-clang ++)从Ubuntu交叉编译适用于Android的grpc C ++(https://github.com/grpc/grpc)。

我已经尝试过以下方法将其编译为Android。

export PATH=/root/Android/arm-26-toolchain-clang/bin:$PATH
export SYSROOT=/root/Android/arm-26-toolchain-clang/sysroot
export CC="arm-linux-androideabi-clang --sysroot $SYSROOT"
export CXX="arm-linux-androideabi-clang++ --sysroot $SYSROOT"


make CFLAGS='-std=c11 -march=armv7-a -D__ANDROID_API__=26' CXXFLAGS='- std=c++11 -frtti -fexceptions -march=armv7-a -D__ANDROID_API__=26' LIBS='-llog -lz -lc++_static' -j2

在编译zlib.c时抛出错误-错误:函数的隐式声明       'lseek'在C99中无效

如何使用上述CLANG编译器指定使用C11进行构建?

当我允许它继续前进而忽略此错误时,它停止在下面-

./src/core/lib/surface/completion_queue.h:92:5: error: unknown type name
  'grpc_experimental_completion_queue_functor'
 grpc_experimental_completion_queue_functor* shutdown_callback);

我尝试从https://github.com/grpc/grpc/tree/master/examples/android/helloworld编译示例,但是在编译boringssl时抛出错误。

您能帮我为工具链arm-linux-androideabi交叉编译gRPC for android吗?

谢谢

2 个答案:

答案 0 :(得分:1)

我可以按照grpc github存储库中Makefile中的交叉编译说明进行构建。创建了如下所示的shell脚本,并且可以正常工作-

export GRPC_CROSS_COMPILE=true
export PATH=/home/ubuntu/stand-alone-toolchain/arm-26-toolchain-clang/bin:$PATH
export SYSROOT=/home/ubuntu/stand-alone-toolchain/arm-26-toolchain-clang/sysroot
export HOST_CC="/usr/bin/gcc"
export HOST_CXX="/usr/bin/g++"
export HOST_LD="/usr/bin/ld"
export CC="arm-linux-androideabi-clang --sysroot $SYSROOT"
export CXX="arm-linux-androideabi-clang++ --sysroot $SYSROOT"
export LD="arm-linux-androideabi-clang++"
export LDXX="arm-linux-androideabi-clang++" 
export AR="arm-linux-androideabi-ar"
export STRIP="arm-linux-androideabi-strip"
export PROTOBUF_CONFIG_OPTS="--host=arm-linux-androideabi --with-sysroot=${SYSROOT} --with-protoc=/usr/local/bin/protoc CFLAGS='-march=armv7-a -D__ANDROID_API__=26' CXXFLAGS='-frtti -fexceptions -march=armv7-a -D__ANDROID_API__=26' LIBS='-llog -lz -lc++_static'"
export HAS_PKG_CONFIG=false
export GRPC_CROSS_LDOPTS="-L$SYSROOT -L/home/ubuntu/cross-grpc/grpc"
export GRPC_CROSS_AROPTS="rc --target=elf32-little"

make

答案 1 :(得分:0)

您可以使用cmake工具链来构建grpc库:

cd <your build directory>
export ANDROID_NDK=<path to your NDK>
cmake <path to your grpc source directory>\
 -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/android.toolchain.cmake\
 -DANDROID_ABI=armeabi-v7a\
 -DANDROID_PLATFORM=android-26\
 -DANDROID_STL=c++_static\
 -DRUN_HAVE_STD_REGEX=0\
 -DRUN_HAVE_POSIX_REGEX=0\
 -DRUN_HAVE_STEADY_CLOCK=0\
 -DCMAKE_BUILD_TYPE=Release
cmake --build . --target grpc++

构建完成后,应生成所有必需的静态库:

find . -type f -name "*.a"
./libgrpc.a
./third_party/zlib/libz.a
./third_party/cares/cares/lib/libcares.a
./third_party/boringssl/crypto/libcrypto.a
./third_party/boringssl/ssl/libssl.a
./third_party/protobuf/libprotobuf.a
./libgpr.a
./libaddress_sorting.a
./libgrpc++.a