一、材料准备
1、protobuf下载
Git链接:https://github.com/google/protobuf
release链接:https://github.com/google/protobuf/releases/tag/v3.3.0
本人使用的的是protobuf-3.3.0
2、NDK下载
3、QT与安卓环境搭建
参照大神的博客:博客链接
二、设置ndk
将下载的ndk(Android-ndk-r14b-Linux-x86_64.zip)解压到指定目录,例如/home/linux/works/android/ndk/
参考如图
三、protobuf编译
1、推荐使用ubuntu编译,使用真机或者VM均可。
2、解压下载到的protobuf-master.zip到你的指定路径,例如我的是 /home/linux/works/protobuff/protobuff-master
参考如图
3、编译前的准备
编译protobuf需要一些工具,比如
* autoconf
* automake
* libtool
* curl (used to download gmock)
* make
* g++
* unzip
在ubuntu上面,可以直接输入命令进行安装 sudo apt-get install autoconf automake libtool curl make g++ unzip
4、先编译ubuntu主机上面使用的
执行命令
(1) ./autogen.sh
(2) ./configure --prefix=/home/linux/works/protobuff_linux 注意:prefix是指定安装目录,按照自己的更改
(3) make
(4)make check 注意:这个不是必须的,即使检查失败,也还是能安装,只是部分不能使用
(5)make install
附:编译给arm用的也简单,先编译给ubuntu用的,随后在2步的时候输入如下参考命令即可,其他一样,CC与CXX是自己arm使用的工具链
- ./configure --prefix=/home/linux/works/protobuff/protobuff_arm --host=arm-linux CC=/home/linux/works/armgcc/armgcc6.3.1/bin/arm-linux-gnueabihf-gcc CXX=/home/linux/works/armgcc/armgcc6.3.1/bin/arm-linux-gnueabihf-g++ --with-protoc=/home/linux/works/protobuff_linux/bin/protoc
./configure --prefix=/home/linux/works/protobuff/protobuff_arm --host=arm-linux CC=/home/linux/works/armgcc/armgcc6.3.1/bin/arm-linux-gnueabihf-gcc CXX=/home/linux/works/armgcc/armgcc6.3.1/bin/arm-linux-gnueabihf-g++ --with-protoc=/home/linux/works/protobuff_linux/bin/protoc
5、编译给android使用的so库
注意,我尝试过使用给arm编译proto的方式来编译给android使用的,但是提示我c编译编译的东西不可执行。百度了有用NDK配合.mk方式来编译,我没有成功过,不过下面这种方式是能够成功的,建议照着下面的做。
编写脚本,填写如下内容(我使用过的)
- #!/bin/sh
- cd /home/linux/works/probuf_ndk/protobuf-master
- NDK_HOME="/home/linux/works/android/ndk/android-ndk-r14b"
- export SYSROOT=$NDK_HOME/platforms/android-21/arch-arm
- export PREBUILT=$NDK_HOME/toolchains/arm-linux-androideabi-4.9
- export LDFLAGS="--sysroot=$SYSROOT"
- export LD="$NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/arm-linux-androideabi/bin/ld $LDFLAGS"
- export LIBS="-llog $NDK_HOME/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/libgnustl_static.a"
- export CPPFLAGS=""
- export INCLUDES="-I$NDK_HOME/sources/cxx-stl/gnu-libstdc++/4.9/include/ -I$NDK_HOME/platforms/android-9/arch-arm/usr/include/ -I$NDK_HOME/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include/"
- export CXXFLAGS="-march=armv7-a -mfloat-abi=softfp -DGOOGLE_PROTOBUF_NO_RTTI --sysroot=$SYSROOT"
- export CCFLAGS="$CXXFLAGS"
- export CXX="$PREBUILT/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ $CXXFLAGS"
- export CC="$PREBUILT/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc $CCFLAGS"
- echo "here"
- echo $NDK_HOME
- echo $CC
- echo $CXX
- echo "end"
- ./autogen.sh
- ./configure --host=arm-linux-androideabi --with-sysroot=$SYSROOT --enable-cross-compile --with-protoc=/home/linux/works/protobuff_linux/bin/protoc --disable-static --enable-shared CXX="$CXX" CC="$CC" LD="$LD"
- make -j4
- cp -v /home/linux/works/probuf_ndk/protobuf-master/src/.libs/* /home/linux/works/protobuff/protobuff_android
#!/bin/sh
cd /home/linux/works/probuf_ndk/protobuf-master
NDK_HOME="/home/linux/works/android/ndk/android-ndk-r14b"
export SYSROOT=$NDK_HOME/platforms/android-21/arch-arm
export PREBUILT=$NDK_HOME/toolchains/arm-linux-androideabi-4.9
export LDFLAGS="--sysroot=$SYSROOT"
export LD="$NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/arm-linux-androideabi/bin/ld $LDFLAGS"
export LIBS="-llog $NDK_HOME/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/libgnustl_static.a"
export CPPFLAGS=""
export INCLUDES="-I$NDK_HOME/sources/cxx-stl/gnu-libstdc++/4.9/include/ -I$NDK_HOME/platforms/android-9/arch-arm/usr/include/ -I$NDK_HOME/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include/"
export CXXFLAGS="-march=armv7-a -mfloat-abi=softfp -DGOOGLE_PROTOBUF_NO_RTTI --sysroot=$SYSROOT"
export CCFLAGS="$CXXFLAGS"
export CXX="$PREBUILT/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ $CXXFLAGS"
export CC="$PREBUILT/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc $CCFLAGS"
echo "here"
echo $NDK_HOME
echo $CC
echo $CXX
echo "end"
./autogen.sh
./configure --host=arm-linux-androideabi --with-sysroot=$SYSROOT --enable-cross-compile --with-protoc=/home/linux/works/protobuff_linux/bin/protoc --disable-static --enable-shared CXX="$CXX" CC="$CC" LD="$LD"
make -j4
cp -v /home/linux/works/probuf_ndk/protobuf-master/src/.libs/* /home/linux/works/protobuff/protobuff_android
其中需要注意的是
1、指定NDK的路径,设置NDK_HOME=你的NDK路径
2、将这个脚本xx.sh与解压的protobuf-master放在一起,注意我填写的protobuf-master的路径,最开的cd命令与最后面的cp命令,均按照自己的实际改一下
3、倒数第三行命令中的
- --with-protoc=/home/linux/works/protobuff_linux/bin/protoc
--with-protoc=/home/linux/works/protobuff_linux/bin/protoc
其中的=号后面的protoc的路径需要根据你自己的更改一下
脚本新,(建议的,暂未测试)
- #!/bin/sh
- cd /home/linux/works/probuf_ndk/protobuf-master
- NDK_HOME="/home/linux/works/android/ndk/android-ndk-r14b"
- export SYSROOT=$NDK_HOME/platforms/android-21/arch-arm
- export PREBUILT=$NDK_HOME/toolchains/arm-linux-androideabi-4.9
- export LDFLAGS="--sysroot=$SYSROOT"
- export LD="$NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/arm-linux-androideabi/bin/ld $LDFLAGS"
- export LIBS="-llog $NDK_HOME/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/libgnustl_static.a"
- export CPPFLAGS=""
- export INCLUDES="-I$NDK_HOME/sources/cxx-stl/gnu-libstdc++/4.9/include/ -I$NDK_HOME/platforms/android-9/arch-arm/usr/include/ -I$NDK_HOME/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include/"
- export CXXFLAGS="-march=armv7-a -mfloat-abi=softfp -DGOOGLE_PROTOBUF_NO_RTTI --sysroot=$SYSROOT"
- export CCFLAGS="$CXXFLAGS"
- export CXX="$PREBUILT/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ $CXXFLAGS"
- export CC="$PREBUILT/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc $CCFLAGS"
- echo "here"
- echo $NDK_HOME
- echo $CC
- echo $CXX
- echo "end"
- ./autogen.sh
- ./configure --prefix=/home/linux/works/protobuff/protobuff_android --host=arm-linux-androideabi --with-sysroot=$SYSROOT --enable-cross-compile --with-protoc=/home/linux/works/protobuff_linux/bin/protoc --disable-static --enable-shared CXX="$CXX" CC="$CC" LD="$LD"
- make -j4
- make install
#!/bin/sh
cd /home/linux/works/probuf_ndk/protobuf-master
NDK_HOME="/home/linux/works/android/ndk/android-ndk-r14b"
export SYSROOT=$NDK_HOME/platforms/android-21/arch-arm
export PREBUILT=$NDK_HOME/toolchains/arm-linux-androideabi-4.9
export LDFLAGS="--sysroot=$SYSROOT"
export LD="$NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/arm-linux-androideabi/bin/ld $LDFLAGS"
export LIBS="-llog $NDK_HOME/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/libgnustl_static.a"
export CPPFLAGS=""
export INCLUDES="-I$NDK_HOME/sources/cxx-stl/gnu-libstdc++/4.9/include/ -I$NDK_HOME/platforms/android-9/arch-arm/usr/include/ -I$NDK_HOME/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include/"
export CXXFLAGS="-march=armv7-a -mfloat-abi=softfp -DGOOGLE_PROTOBUF_NO_RTTI --sysroot=$SYSROOT"
export CCFLAGS="$CXXFLAGS"
export CXX="$PREBUILT/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ $CXXFLAGS"
export CC="$PREBUILT/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc $CCFLAGS"
echo "here"
echo $NDK_HOME
echo $CC
echo $CXX
echo "end"
./autogen.sh
./configure --prefix=/home/linux/works/protobuff/protobuff_android --host=arm-linux-androideabi --with-sysroot=$SYSROOT --enable-cross-compile --with-protoc=/home/linux/works/protobuff_linux/bin/protoc --disable-static --enable-shared CXX="$CXX" CC="$CC" LD="$LD"
make -j4
make install
参考如图
6、开始编译
给sh添加可执行权限 sudo chmod +x xx.sh
执行sh ./xx.sh
等待一会即可,完成过后,会将生成的库拷贝到你的指定文件夹中去
四、QT+protobuf编译android
我把生成的库全部拷贝到windows上面使用,路径在
1、新建工程,略
2、pro配置
参考配置
unix:android{
3、给apk添加额外的so库INCLUDEPATH += D:\protobuf\protobuff_android\includeLIBS += -L"D:\protobuf\protobuff_android\lib" \-lprotobuf \-lprotobuf-lite \-lprotoc
}
如果不添加的话,就不会拷贝到apk中,后面在运行的时候就会出问题
添加方法:项目->Build Android APK->Addtional Libraries->add
实例如图
4、可以开始编译了
我的工程如下
其中 .pb.h与.pb.cc是编写 xxx.proto后经过protoc生成的
生成参考命令如下,可以考虑写成一个bat来调用
D:\protobuf\protobuf_win_3.3.0\bin\protoc.exe --cpp_out=./ messages.proto
pause
其中的messages.proto就是我自己编写的proto,注意前面的protoc.exe则根据自己的实际情况更换路径
参考如图
现在编译,应该不会出现什么意外情况了,完成后直接安装到手机即可运行。
如果有遇到问题,请留言,按理来说,用cywin也能编译,只是要主要把一些要用的的库上,其他的使用如上。
附一些参考链接:
1、使用NDK编译protobuf,没有使用MK的方式,使用脚本。链接:https://stackoverflow.com/questions/44773136/google-protobuf-and-android-ndk,点击打开链接
2、windows编译protobuf参考,链接:http://blog.csdn.NET/imilli/article/details/53015885,点击打开链接