grpc在windows平台交叉编译android库(完全编译通过)

配置工具:

1. cmake(最新版本)

2. grpc源码v1.28.0(github上下载,third_party需要boringssl, boringssl-with-bazel, cares, protobuf,abseil-cpp, zlib, 根据.gitsubmodule的路径去github下载放到third_party里面,使用git --init submodule下载太慢)

grpc https://github.com/grpc/grpc

boringssl 可以不下载

boringssl-with-bazel https://github.com/boatxing/boringssl-with-bazel

cares https://github.com/c-ares/c-ares.git

protobuf https://github.com/google/protobuf.git

abseil-cpp https://github.com/abseil/abseil-cpp.git

zlib https://github.com/madler/zlib

3. ndk(跨平台编译工具)

脚本命令:

mkdir grpc_cmake

cd grpc_cmake

cmake ../grpc-1.28.1 -G "Unix Makefiles" ^
-DCMAKE_TOOLCHAIN_FILE=D:/android_ndk/android-ndk-r19c/build/cmake/android.toolchain.cmake ^
-DANDROID_ABI=armeabi-v7a ^
-DANDROID_PLATFORM=android-24 ^
-DCMAKE_MAKE_PROGRAM=D:/android_ndk/android-ndk-r19c/prebuilt/windows-x86_64/bin/make.exe ^

 -DCMAKE_BUILD_TYPE=MinSizeRel ^
 -DBUILD_SHARED_LIBS=ON 

参数说明:

1. 创建grpc_cmake文件夹是为了存放生成的cmake文件和库文件,防止和源码混乱,它和grpc源码目录在同一目录

2. -DCMAKE_TOOLCHAIN_FILE 工具链文件路径

3. -DANDROID_ABI=armeabi-v7a 安卓架构(armeabi-v7a, arm64-v8a,x86等)

4. -DCMAKE_MAKE_PROGRAM make.exe所在路径(一定要设置,不然配置不能成功)

5. -DCMAKE_BUILD_TYPE=MinSizeRel(编译类型,debug/release/MinSizeRel等)

 6. -DBUILD_SHARED_LIBS=ON (动态库开关,不设置默认编译静态库)

开始编译:

1. 生成所有 cmake --build . --target all

2. 其实我们只需要生成gpr、grpc、grpc++即可

    cmake --build . --target gpr(一次编译通过)

    cmake --build . --target grpc (编译会有问题,看下面注意事项)

    cmake --build . --target grpc++

3. 显示如下即表示生成成功

grpc在windows平台交叉编译android库(完全编译通过)_第1张图片

grpc在windows平台交叉编译android库(完全编译通过)_第2张图片

注意事项:

grpcv1_22.0动态库在android平台上调用buildAndStart接口会崩溃,静态库正常

grpcv1_28.0动态库在android上可以正常调用

报错一:

gRPC_SSL_PROVIDER is "module" but BORINGSSL_ROOT_DIR is wrong

打开cmake/ssl.cmake文件,找到24行 if(EXISTS "${BORINGSSL_ROOT_DIR}/CMakeLists.txt"),原来是third_party/boringssl-with-bazel目录下没有CMakeLists.txt造成的,重新到github上下载含有CMakeLists.txt的文件

grpc默认使用的ssl module为boringssl-with-bazel

报错二:

boringssl-with-bazel/crypto/fipsmodule/aes-armv4.S:363:2: error: out of range immediate fixup value
 sub r10,r3,#asm_AES_encrypt-AES_Te @ Te

crypto/fipsmodule

打开CMakeList.txt,添加

set(OPENSSL_NO_ASM "1")

不允许ASM

报错三:

fatal error: 'openssl/x509.h' file not found #include

打开cmake/ssl.cmake文件,找到46行,ssl头文件路径不对

set(_gRPC_SSL_INCLUDE_DIR ${BORINGSSL_ROOT_DIR}/src/include)

改成

set(_gRPC_SSL_INCLUDE_DIR ${BORINGSSL_ROOT_DIR}/include)

报错四:

third_party/protobuf/src/google/protobuf/stubs/common.cc:149: error: undefined reference to '__android_log_write'

缺少android系统库liblog.a造成的,不知道为啥会缺这个库,也不知道到哪里下载,因为这两行代码只是输出android日志的,可以隐藏掉,不影响库的正常功能使用

报错五:

error: undefined reference to 'inflateInit2_

缺少第三方库zlib,到github上下载后放入third_party目录

你可能感兴趣的:(grpc)