Qt On Android + protobuf3的使用

来源:互联网 发布:清理后台的软件 编辑:程序博客网 时间:2024/06/02 19:43

一、材料准备

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下载

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


5、编译给android使用的so库

注意,我尝试过使用给arm编译proto的方式来编译给android使用的,但是提示我c编译编译的东西不可执行。百度了有用NDK配合.mk方式来编译,我没有成功过,不过下面这种方式是能够成功的,建议照着下面的做。

编写脚本,填写如下内容(我使用过的)

#!/bin/shcd /home/linux/works/probuf_ndk/protobuf-masterNDK_HOME="/home/linux/works/android/ndk/android-ndk-r14b"export SYSROOT=$NDK_HOME/platforms/android-21/arch-armexport PREBUILT=$NDK_HOME/toolchains/arm-linux-androideabi-4.9export 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_HOMEecho $CC echo $CXXecho "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 -j4cp -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
其中的=号后面的protoc的路径需要根据你自己的更改一下


脚本新,(建议的,暂未测试)

#!/bin/shcd /home/linux/works/probuf_ndk/protobuf-masterNDK_HOME="/home/linux/works/android/ndk/android-ndk-r14b"export SYSROOT=$NDK_HOME/platforms/android-21/arch-armexport PREBUILT=$NDK_HOME/toolchains/arm-linux-androideabi-4.9export 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_HOMEecho $CC echo $CXXecho "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 -j4make install


参考如图


6、开始编译

给sh添加可执行权限  sudo chmod +x xx.sh

执行sh   ./xx.sh

等待一会即可,完成过后,会将生成的库拷贝到你的指定文件夹中去


四、QT+protobuf编译android

我把生成的库全部拷贝到windows上面使用,路径在


1、新建工程,略

2、pro配置

参考配置

unix:android{
INCLUDEPATH += D:\protobuf\protobuff_android\include
LIBS += -L"D:\protobuf\protobuff_android\lib" \
            -lprotobuf \
            -lprotobuf-lite \
            -lprotoc
}
3、给apk添加额外的so库

如果不添加的话,就不会拷贝到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,点击打开链接


原创粉丝点击