【Protobuf】如何编译 Android Native 的 Protobuf 库

本文记录在实际使用中编译 Android Native 的 Protobuf 库的过程,以备不时之需。我是采用 NDK 的独立工具链的形式编译的,编译的 Protobuf 的版本是 2.6.1 。更高版本的编译方法可以参考如下第二篇文献。

参考:

  1. How to use NDK to build Protobuf to run on Android
  2. linxu NDK编译protobuf方法2 各种NDK版本的编译方法

1. 制作 NDK 独立工具链

首先,基于NDK17制作一个独立工具链,后面通过此工具链来编译 Protobuf 。

# 使用 ndk17 生成一个工具链
bash /Users/lixiaoqing/Library/Android/sdk/ndk/17.2.4988734/build/tools/make-standalone-toolchain.sh \
--arch=arm \
--platform=android-17 \
--toolchain=arm-linux-androideabi-4.9 \
--install-dir=/Users/lixiaoqing/Desktop/Tools/toolchains/arm-ndk17

2. 下载 Protobuf 源码

cd /Users/lixiaoqing/Desktop/Tools/protobuf/
git clone https://github.com/protocolbuffers/protobuf.git
cd protobuf
git checkout v2.6.1
./autogen.sh
mkdir build && cd build
vim build_protobuf_android.sh

注意:如果在执行 autogen.sh 脚本的时候提示 tar 错误,原因是之前的网址已经没有 googletest 的资源,需要修改该脚本为:

#curl http://googletest.googlecode.com/files/gtest-1.5.0.tar.bz2 | tar jx
#mv gtest-1.5.0 gtest
curl -L https://github.com/google/googletest/archive/release-1.5.0.tar.gz | tar zx
mv googletest-release-1.5.0 gtest

3. 编译 Protobuf

基于 llvm 的 c++_shared.so 编译 protobuf :

toolchain_path=/Users/lixiaoqing/Desktop/Tools/toolchains/arm-ndk17/
export NDK_ROOT=/Users/lixiaoqing/Library/Android/sdk/ndk/17.2.4988734
export PREFIX=/Users/lixiaoqing/Desktop/Tools/protobuf/build
export PATH=${toolchain_path}/bin:$PATH
export SYSROOT=${toolchain_path}/sysroot
export CC="arm-linux-androideabi-gcc --sysroot $SYSROOT"
export CXX="arm-linux-androideabi-g++ --sysroot $SYSROOT"
export CXXSTL=$NDK_ROOT/sources/cxx-stl/llvm-libc++

../configure \
--prefix=$PREFIX \
--host=arm-linux-androideabi \
--with-sysroot="${SYSROOT}" \
--enable-shared \
--enable-cross-compile \
--with-protoc=protoc \
CFLAGS="-march=armv7-a -D__ANDROID_API__=17" \
CXXFLAGS="-frtti -fexceptions -march=armv7-a -D__ANDROID_API__=17" \
LDFLAGS="-L${NDK_ROOT}/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a" \
LIBS="-llog -lz -lc++_shared"

make -j10
make install

然后运行该脚本,开始编译 protobuf ,编译成功的 protobuf 库和头文件在上面脚本文件中 PREFIX 目录下:

# 库目录
lib/

# 头文件目录
include/

问题

但是,我通过此方法编出来的 protobuf 和一位同事编出来的库不一致。比如对于这个符号 SerializeToString ,我编出来的库是这样的:

$ nm libprotobuf.a | grep SerializeToString
00001b10 T _ZNK6google8protobuf11MessageLite17SerializeToStringEPSs
         U _ZNK6google8protobuf11MessageLite17SerializeToStringEPSs

而同事编出来的符号是这样的:

$ nm libprotobuf.a | grep SerializeToString
000021d8 T _ZNK6google8protobuf11MessageLite17SerializeToStringEPNSt6__ndk112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE
         U _ZNK6google8protobuf11MessageLite17SerializeToStringEPNSt6__ndk112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE

项目如果使用我编的库会出现问题,而使用同事编的库则没有问题。尝试了多次我编出来的库还是会有一样的问题,我也不知道问题出在了哪,各位如果知道的话还请不吝赐教,感谢~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Protobuf编译是指将.proto文件编译成可用的代码文件。在Windows下,可以使用protoc.exe执行以下命令来进行编译: ``` protoc --cpp_out=. example.proto ``` 这将生成example.proto.h和example.proto.cc文件,其中example.proto是你的.proto文件的名称。\[1\] 编译.proto文件的指令格式为: ``` protoc \[--proto_path=IMPORT_PATH\] --cpp_out=DST_DIR file.proto ``` 其中: - --proto_path:指定.proto文件的检索路径,可以多次指定。如果不指定,默认在当前文件夹下检索。 - --cpp_out:指定编译后的文件类型为C++。 - DST_DIR:指定生成文件的存放路径。 - file.proto:指定要编译的.proto文件(在--proto_path路径下的文件)。\[2\] 通过以上命令进行编译后,你将得到可以在C++代码中使用的protobuf相关文件,可以根据需要进行序列化和反序列化操作。\[3\] #### 引用[.reference_title] - *1* [protobuf 编译及使用](https://blog.csdn.net/WeinKee/article/details/105152620)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [【Protobuf速成指南】.proto文件的编写与编译](https://blog.csdn.net/whc18858/article/details/131064187)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值