一 、编译环境介绍:(有一部分原因是环境造成编译失败)
系统版本:windows 10 64位(可以使用虚拟机)
NDK版本:Android-ndk-r17b
源码版本:protobuf-3.6.1
二、编译步骤,设置临时编译环境
1. 下载并安装最新的 cmake 3.10 x86_64
2.NDK 环境变量配置;
3.解压 protobuf 到固定目标,非C盘最好;
三、编译
打开window cmd ,cd 到源码位置
cmake -G "MinGW Makefiles"
-DCMAKE_TOOLCHAIN_FILE=<NDK PATH>/build/cmake/android.toolchain.cmake
-DCMAKE_MAKE_PROGRAM=<NDK PATH>/prebuilt/windows-x86_64/bin/make.exe
-Dprotobuf_BUILD_TESTS=OFF -DANDROID_ABI="armeabi"
<Protobuf source PATH>/cmake
cmake --build . --target libprotobuf-lite --config Release
将相应的 PATH 替换成你的实际路径;
例:
cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=E:/ndk/android-ndk-r17b/build/cmake/android.toolchain.cmake -DCMAKE_MAKE_PROGRAM=E:/ndk/android-ndk-r17b/prebuilt/windows-x86_64/bin/make.exe -Dprotobuf_BUILD_TESTS=OFF E:/android/protobuf-3.6.1/cmake -DANDROID_ABI="armeabi"
cmake --build . --target libprotobuf-lite --config Release
解释下几个关键参数:
1.CMAKE_TOOLCHAIN_FILE
,这个变量指定了 cmake 使用的 toolchain 脚本,toolchain脚本会帮助配置交叉编译使用的头文件/库文件路径,配置编译器/链接器等一系列工具。
2.CMAKE_MAKE_PROGRAM
,这个变量指定了cmake使用的make程序,如果系统的PATH
中没有 make.exe
的话(通常也不会有,除非安装了 MinGW 并且配置了 PATH
环境变量),就需要指定使用的 make.exe
程序。这里使用了 ndk 自带的 prebuilt 版 make.exe
3.
protobuf_BUILD_TESTS
,不要编译测试用例,这一选项默认启用,但在交叉编译时会导致奇怪的问题。
-G "MinGW Makefiles"
,指定 cmake 生成 MinGW Makefile
,即一般所说的 Makefile
。
4.-DANDROID_ABI 可以用来指定生成不同的版本,v7,v8 64
例:-DANDROID_ABI="armeabi" v7 32位
-DANDROID_ABI="arm64-v8a" v8 64位
5、-DCMAKE_BUILD_TYPE 指定编译 类型 默认是 debug ,一般最好指定 release;
最后可以编译出 protobuf 或 protobuf-lite;
cmake --build . --target libprotobuf
cmake --build . --target libprotobuf-lite
分别编译libprotobuf
和libprotobuf-lite
两个库,这两个库就是我们将会用到的 protobuf
静态库了。
我已经做成 bat 可执行文件,将上面的例子路径改成自己的路径,拷贝入文本,重命名为.bat。双击执行,可生成相关的.a文件。
注意:32位和64位,尽量放在两个文件夹下编译,否则有重新的文件可能会产生错误,源码复制两份,不同文件夹。