首页 > 其他分享 >Android NDK下编译google protocol buffer(protobuf)

Android NDK下编译google protocol buffer(protobuf)

时间:2022-12-27 15:34:04浏览次数:62  
标签:src NDK google protocol protobuf cc LOCAL 2.4


前面发了一片windows下编译protobuf的文章

后来把生成的.a文件加到android工程后发现不可用

所以只好自己使用NDK编译protobuf了(虽然这样,生成的Inclule的头文件还是很有用的,可以直接用到jni的代码中)

Android NDK编译protobuf

其实用NDK编译最大的难点就是make文件,把这个搞定就基本搞定了

好了,现在开始吧

一、安装java环境和NDK环境(不多说,自己准备)

​http://code.google.com/p/protobuf/downloads/list​​ )

三、建立java的android工程,在根目录下简历jni目录,把protobuf代码解压到jni目录下

如图:

Android NDK下编译google protocol buffer(protobuf)_源文件

四、写application.mk文件,这个有个问题,protobuf需要使用gnustl_static,我替你写好了,直接复制过去吧,平台不如不一样,修改一下

APP_PLATFORM := android-9
#APP_STL := stlport_static 
APP_STL := gnustl_static

五、开始写android.mk文件

这个是个大难题了,打开文件结构一看,各种文件都有,也不知道要包含哪些,而且有些文件是编译不过的(可能是google的测试代码),所以这个就成了最大问题了

没关系,在各种痛苦的时候我突然想到了一个办法,并且最后成功的编译出来了

我想到了在windows下,用vs2008打开protobuf的代码时,下面有好几个工程,而对我们有用的其实只有一个,就是libprotobuf

Android NDK下编译google protocol buffer(protobuf)_android_02


所以,打开这个工程,看看里面都有什么.c和.cc或.cpp文件,把所有文件写进make文件去就好了,然后把头文件目录加进去,OK,打工告成

为了方便大家,我把我的make文件提出来给大家吧,我是把protobuf编译给其他程序使用,所以只生成了.a文件,用来做动态连接,需要生成.so的人需要稍微修改一下

android.mk:

LOCAL_PATH := $(call my-dir)




################## Build ProtoBuf ################
include $(CLEAR_VARS)


LOCAL_ARM_MODE := arm
LOCAL_CPPFLAGS += -frtti
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_MODULE := libProtobuf
LOCAL_MODULE_TAGS := optional
LOCAL_CPP_EXTENSION := .cc
LOCAL_SRC_FILES := \
protobuf-2.4.1/src/google/protobuf/io/coded_stream.cc                \
protobuf-2.4.1/src/google/protobuf/stubs/common.cc                   \
protobuf-2.4.1/src/google/protobuf/descriptor.cc                     \
protobuf-2.4.1/src/google/protobuf/descriptor.pb.cc                  \
protobuf-2.4.1/src/google/protobuf/descriptor_database.cc            \
protobuf-2.4.1/src/google/protobuf/dynamic_message.cc                \
protobuf-2.4.1/src/google/protobuf/extension_set.cc                  \
protobuf-2.4.1/src/google/protobuf/extension_set_heavy.cc            \
protobuf-2.4.1/src/google/protobuf/generated_message_reflection.cc   \
protobuf-2.4.1/src/google/protobuf/generated_message_util.cc         \
protobuf-2.4.1/src/google/protobuf/io/gzip_stream.cc                 \
protobuf-2.4.1/src/google/protobuf/compiler/importer.cc              \
protobuf-2.4.1/src/google/protobuf/message.cc                        \
protobuf-2.4.1/src/google/protobuf/message_lite.cc                   \
protobuf-2.4.1/src/google/protobuf/stubs/once.cc                     \
protobuf-2.4.1/src/google/protobuf/compiler/parser.cc                \
protobuf-2.4.1/src/google/protobuf/io/printer.cc                     \
protobuf-2.4.1/src/google/protobuf/reflection_ops.cc                 \
protobuf-2.4.1/src/google/protobuf/repeated_field.cc                 \
protobuf-2.4.1/src/google/protobuf/service.cc                        \
protobuf-2.4.1/src/google/protobuf/stubs/structurally_valid.cc       \
protobuf-2.4.1/src/google/protobuf/stubs/strutil.cc                  \
protobuf-2.4.1/src/google/protobuf/stubs/substitute.cc               \
protobuf-2.4.1/src/google/protobuf/text_format.cc                    \
protobuf-2.4.1/src/google/protobuf/io/tokenizer.cc                   \
protobuf-2.4.1/src/google/protobuf/unknown_field_set.cc              \
protobuf-2.4.1/src/google/protobuf/wire_format.cc                    \
protobuf-2.4.1/src/google/protobuf/wire_format_lite.cc               \
protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream.cc            \
protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream_impl.cc       \
protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream_impl_lite.cc  \


LOCAL_C_INCLUDES += . \
$(LOCAL_PATH)/protobuf-2.4.1/src \
$(LOCAL_PATH)/protobuf-2.4.1 \
#$(LOCAL_PATH)/protobuf-2.4.1/vsprojects \





LOCAL_LDLIBS := -llog -lgcc -pthread \
      C:/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/libstdc++.a \


ifndef NDK_ROOT
include external/stlport/libstlport.mk
endif
include $(BUILD_STATIC_LIBRARY)

六、cygwin到android工程目录,执行ndk-build即可

首先,android.mk文件与其它文件的区别之处

LOCAL_CPP_EXTENSION := .cc  .cpp 

因为protobuf的源文件是*.cc的,利用proto生成的文件也是*.cc的格式,所以需要把*.cc,*.cpp添加到LOCAL_CPP_EXTENSION 里面

接着利用上面博客里面说道的protobuf需要的文件添加到mk文件的LOCAL_SRC_FILES里面,注意路径就行,这点不在叙述

由于源文件里面用到了config.h,而这个文件是在VS工程目录下的,不在src/google/目录里面,所以需要把此文件copy到google目录里面(或者其子目录里面)

接着修改config.h文件,详细情况如下:

Android NDK下编译google protocol buffer(protobuf)_android_03

​ 最上面的红色区域为,非WIN32环境下需要的头文件和namespace

中间的红色区域注释掉,如果不注释掉的话,ndk编译的时候会报ndk里面的一个D:\android-ndk-r8\sources\cxx-stl\gnu-libstdc++\include\backward\backward_warning.h文件找不到,其实这个文件是有的,具体为啥找不到,我不得而知,而且baidu和google也都没办法找到答案,好几个国外的网站上有这个问题,不过天朝和谐了,没办法查看。

第三个红色区域,为自己添加的宏,非win32环境需要用到pthread,源文件里面就是用这个宏来区别的

最后一点,设置LOCAL_C_INCLUDES的时候,一定要把之前config.h文件所在目录的路径包含进去,否则编译会找不到config.h文件

当所以上面的这些都搞定之后,那就用cgywin去ndk-build吧

我用真机测试过,收发协议正常。童鞋们有任何疑问欢迎留言(网上好难找到关于protobuf的ndk编译过程,上面的博客没有对config.h文件要修改进行说明,所以直接copy下去是不会通过的)。



标签:src,NDK,google,protocol,protobuf,cc,LOCAL,2.4
From: https://blog.51cto.com/u_15923385/5972862

相关文章

  • 安卓SO层开发 -- 第一个NDK项目
    0x01新建项目1、选择NativeC++2、填写项目名称、项目位置等相关信息3、选择C++版本信息,默认即可0x02项目源码结构介绍1、编译后生成的so文件名称static{System.......
  • https Java SSL Exception protocol_version
      在java代码中,使用HttpClient爬取https页面时,遇到了这个bug:javax.net.ssl.SSLException:Receivedfatalalert:protocol_version     先奉上初始的代码:1/**2......
  • 在iOS中使用NSURLProtocol进行网络代理
    在iOS中使用NSURLProtocol进行网络代理一引言网络能力是互联网应用程序必不可少的功能。随着应用程序的复杂,对网络的依赖性也会逐渐增高。如何统一的处理请求头,统一的处理......
  • 调用OpenSL ES NDK播放声音
    AndroidNDK给出了native-audio的例子,这个例子结合java代码,讲解了如何使用OpenSL播放声音。我把此例子进行了精简,完全使用c,可以让我们更好的体会到OpenSL的用法,不多说,上代......
  • 使用 Google Cloud Pub/Sub 发送消息
    本指南将引导您完成在程序的不同部分或不同程序之间交换消息的过程,使用弹簧集成通道适配器和谷歌云发布/订阅作为底层消息交换机制。您将构建的内容一个弹簧启动向自身发送......
  • Android NDK的生命周期JNI_OnLoad与JNI_OnUnload
    NDK的生命周期//当动态库被加载时这个函数被系统调用JNIEXPORTjintJNICALLJNI_OnLoad(JavaVM*vm,void*reserved){LOGI("JNI_OnLoad");retur......
  • 使用NDK编译 libyuv
    官方源码:http://code.google.com/p/libyuv/简介:libyuvisanopensourceprojectthatincludesYUVscalingandconversionfunctionality.ScaleYUVtoprepare......
  • 用Android Studio更新Android SDK / Android NDK版本
    以前做安卓开发的时候是用Ecliplse+Androidsdk,每次sdk版本更新的时候都是要去网路上搜索并下载对应的sdk版本(有时候某些站点还不能直接访问,只能另外寻找国内的镜像站点);And......
  • 广播 goAsync 源码分析,为什么 Google 大佬都在使用它
    hi大家好,我是DHL。公众号:ByteCode,专注有用、有趣的硬核原创内容,Kotlin、Jetpack、性能优化、系统源码、算法及数据结构、大厂面经。近期在分析问题过程中,需要反编译Goog......
  • Google的操作系统就是Ubuntu?
    记得以前网上曾有一个新闻说google要推出基于Linux的桌面操作系统与微软竞争,不过事过不久后有人指出该新闻是某网友制作的假新闻。虽然这条假新闻没有当年盖茨遇刺身亡那么......