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. 显示如下即表示生成成功
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目录