文档章节

Linux 下使用 NDK 编译 protobuf 2.6.1

O
 OneByOneNext
发布于 2015/03/03 16:39
字数 1354
阅读 104
收藏 0
点赞 0
评论 0

1. Android.mk 文件相关基础

   Android 工程中,src 子目录存放 Android 工程的 java 代码, jni 子目录存放 Android 工程的 C/C++ 代码。

将文件夹 protobuf-2.6.1 拷贝到 jni 目录下,编写模块编译脚本 jni/Android.mk 内容如下:

LOCAL_PATH := $(call my-dir)




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


LOCAL_ARM_MODE := arm
LOCAL_CPPFLAGS += -frtti
#LOCAL_MODULE_CLASS 为编译后的文件保存位置,SHARED_LIBRARIES 为 /system/lib
LOCAL_MODULE_CLASS := SHARED_LIBRARIES            
LOCAL_MODULE := libProtobuf
LOCAL_MODULE_TAGS := optional
LOCAL_CPP_EXTENSION := .cc
LOCAL_SRC_FILES := \
protobuf-2.6.1/src/google/protobuf/io/coded_stream.cc                \
protobuf-2.6.1/src/google/protobuf/stubs/common.cc                   \
protobuf-2.6.1/src/google/protobuf/descriptor.cc                     \
protobuf-2.6.1/src/google/protobuf/descriptor.pb.cc                  \
protobuf-2.6.1/src/google/protobuf/descriptor_database.cc            \
protobuf-2.6.1/src/google/protobuf/dynamic_message.cc                \
protobuf-2.6.1/src/google/protobuf/extension_set.cc                  \
protobuf-2.6.1/src/google/protobuf/extension_set_heavy.cc            \
protobuf-2.6.1/src/google/protobuf/generated_message_reflection.cc   \
protobuf-2.6.1/src/google/protobuf/generated_message_util.cc         \
protobuf-2.6.1/src/google/protobuf/io/gzip_stream.cc                 \
protobuf-2.6.1/src/google/protobuf/compiler/importer.cc              \
protobuf-2.6.1/src/google/protobuf/message.cc                        \
protobuf-2.6.1/src/google/protobuf/message_lite.cc                   \
protobuf-2.6.1/src/google/protobuf/stubs/once.cc                     \
protobuf-2.6.1/src/google/protobuf/compiler/parser.cc                \
protobuf-2.6.1/src/google/protobuf/io/printer.cc                     \
protobuf-2.6.1/src/google/protobuf/reflection_ops.cc                 \
protobuf-2.6.1/src/google/protobuf/repeated_field.cc                 \
protobuf-2.6.1/src/google/protobuf/service.cc                        \
protobuf-2.6.1/src/google/protobuf/stubs/stringprintf.cc             \
protobuf-2.6.1/src/google/protobuf/io/strtod.cc                      \
protobuf-2.6.1/src/google/protobuf/stubs/structurally_valid.cc       \
protobuf-2.6.1/src/google/protobuf/stubs/strutil.cc                  \
protobuf-2.6.1/src/google/protobuf/stubs/substitute.cc               \
protobuf-2.6.1/src/google/protobuf/text_format.cc                    \
protobuf-2.6.1/src/google/protobuf/io/tokenizer.cc                   \
protobuf-2.6.1/src/google/protobuf/unknown_field_set.cc              \
protobuf-2.6.1/src/google/protobuf/wire_format.cc                    \
protobuf-2.6.1/src/google/protobuf/wire_format_lite.cc               \
protobuf-2.6.1/src/google/protobuf/io/zero_copy_stream.cc            \
protobuf-2.6.1/src/google/protobuf/io/zero_copy_stream_impl.cc       \
protobuf-2.6.1/src/google/protobuf/io/zero_copy_stream_impl_lite.cc  \


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


LOCAL_LDLIBS := -llog -pthread 
LOCAL_STATIC_LIBRARIES := -lgcc /home/conner/android-ndk-r9/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi/libsupc++.a \


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

 以上内容解释如下:

    LOCAL_PATH := $(call my-dir)

每个Android.mk文件都必须在开头定义 LOCAL_PATH 变量。这个变量被用来寻找C/C++源文件。在该例中,my-dir 是一个由编译系统提供的宏函数,用于返回Android.mk所在目录的路径。

    include $(CLEAR_VARS)

CLEAR_VARS是编译系统预定义的一个变量,它指向一个特殊的Makefile,这个Makefile负责清除 LOCAL_xxx 的变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES 等)但不会清除 LOCAL_PATH。之所以需要清理这些变量是因为所有的编译控制文件是在一趟make执行过程中完成的,而所有的变量都是全局的,会对其他Android.mk文件产生影响。

    LOCAL_ARM_MODE := arm

默认情况下,arm目标二进制会以thumb的形式生成(16位),你可以通过设置这个变量为arm如果你希望你的module是以32位指令的形式。 'arm' (32-bit instructions) mode. E.g.: LOCAL_ARM_MODE := arm

注意你同样可以在编译的时候告诉系统编译特定的类型,比如 LOCAL_SRC_FILES := foo.c bar.c.arm

这样就告诉系统总是将bar.c以arm的模式编译

    LOCAL_MODULE := hello-jni

LOCAL_MODULE 用来给每个模块定义一个名字,不同模块的名字不能相同,不能有空格。这里的名字会传给NDK编译系统,然后加上lib前缀和.so后缀 (例如,变成libhello-jni.so)。注意,如果你在LOCAL_MODULE定义中自己加上了lib前缀,则ndk在处理的时候就不会再加上lib前缀了(为了兼容Android系统的一些源码)。

    LOCAL_MODULE_TAGS := optional

LOCAL_MODULE_TAGS 后的参数有 user eng tests optional debugeng: 指该模块只在eng版本下才编译makePRODUCT-XXX-eng,); tests: 指该模块只在tests版本下才编译并且生成(makePRODUCT-XXX-tests,不会生成image和system/app/,在data/app/下生成包含LOCAL_MODULE_TAGS :=tests的apk,不会受the product definition files的影响,不会编译非tag=tests的模块);debug: 指该模块只在userdebug版本下才编译(makePRODUCT-XXX-userdebug);optional:指该模块在所有版本下都编译(经过测试optional在tests版本下不编译,其他的版本都会编译,如果该模块the product definition files则会打包成apk)

    LOCAL_SRC_FILES := ...

在LOCAL_SRC_FILES 变量里面列举出对应于同一个模块的、要编译的那些文件,这里不要把头文件加进来,编译系统可以自动检测头文件依赖关系。默认情况下,C++源码文件的扩展名应该是cpp,如果想修改的话,将变量LOCAL_CPP_EXTENSION修改为你想要的扩展名,注意句点。例如:LOCAL_CPP_EXTENSION := .cxx

    include $(BUILD_SHARED_LIBRARY)

这个 BUILD_SHARED_LIBRARY也是预定义的变量,也是指向一个Makefile,负责将你在 LOCAL_XXX 等变量中定义信息收集起来,确定要编译的文件、如何编译。如果要编译的是静态库而不是动态库,则可以用 BUILD_STATIC_LIBRARY。


    LOCAL_LDLIBS := -llog -pthread

LOCAL_LDLIBS 表示要链接的动态库,LOCAL_STATIC_LIBRARIES 表示要链接的静态库

    LOCAL_C_INCLUDES += . $(LOCAL_PATH)/protobuf-2.6.1/vsprojects

是因为代码中用到此目录下的 config.h 文件,也可以直接把 config.h 文件拷贝到 src 目录下,就可以不用包含这个路径,此路径下的 config.h 是VS工程用的,所以需要修改:

/* protobuf config.h for MSVC.  On other platforms, this is generated
 * automatically by autoheader / autoconf / configure. */

/* the location of <hash_map> */
//#define HASH_MAP_H <hash_map>

/* the namespace of hash_map/hash_set */
// Apparently Microsoft decided to move hash_map *back* to the std namespace
// in MSVC 2010:
//   http://blogs.msdn.com/vcblog/archive/2009/05/25/stl-breaking-changes-in-visual-studio-2010-beta-1.aspx
// TODO(kenton):  Use unordered_map instead, which is available in MSVC 2010.
#if _MSC_VER < 1310 || _MSC_VER >= 1600
#define HASH_NAMESPACE std
#else

#ifdef _WIN32
#define HASH_NAMESPACE stdext

#else 
#define HASH_SET_H <ext/hash_set>
#define HASH_MAP_H <ext/hash_map>
#define HASH_NAMESPACE __gun_cxx
#endif

#endif
/* the location of <hash_set> */

/* define if the compiler has hash_map */
//#define HAVE_HASH_MAP 1

/* define if the compiler has hash_set */
//#define HAVE_HASH_SET 1

/* define if you want to use zlib.  See readme.txt for additional
 * requirements. */
// #define HAVE_ZLIB 1
#define HAVE_PTHREAD

   


2. jni 目录下还需要 Application.mk 文件,内容如下:

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


3.工程目录下执行 ndk-build 命令,进行编译


参考:

http://blog.csdn.net/smfwuxiao/article/details/8530742


© 著作权归作者所有

共有 人打赏支持
O
粉丝 1
博文 5
码字总数 1889
作品 0
青岛
hadoop2.6.4 安装和编译

hadoop集群搭建 tools: SecureCRT8.0 VMware12 RHEL 6.6 x64 网络规划: hadoop0 192.168.248.150 hadoop1 192.168.248.151 hadoop2 192.168.248.152 hadoop3 192.168.248.153 设置静态ip:......

lizer2016 ⋅ 2016/07/26 ⋅ 0

google的protobuf库

这篇文章将讲述如何使用google的protobuf库实现一个RPC service,就实现一个最简单的service吧:echo.文章对应的代码都可以在eventrpc中找到,写下这篇文章时的svn revision是138. 1) 定义协议首...

moki_oschina ⋅ 06/06 ⋅ 0

grpc| python 实战 grpc

date: 2018-5-15 22:12:32 title: grpc| python 实战 grpc description: 只要代码可以跑起来, 很多难题都会迎刃而解. so, keep coding and stay hungry. 之前用 swoole 写 server 时就接触过...

daydaygo ⋅ 05/16 ⋅ 0

基于Go语言的protobuf 安装 以及简单测试用例

先去官网下载protobuf的源码 https://github.com/google/protobuf/releases 可以先下载本地,然后上传到虚拟机中 我选择的是Source code(tar.gz) 安装依赖包(如果缺少包,可能会报错) yum i...

故新 ⋅ 06/13 ⋅ 0

hadoop-2.6.4集群编译搭建-阿里云和腾讯云

腾讯云阿里云 hadoop集群编译搭建 环境准备 阿里云配置: 腾讯云配置: 创建用户 useradd hadoop passwd haddop jdk1.7安装: 下载:http://www.oracle.com/technetwork/java/javase/downloa...

lizer2016 ⋅ 2016/07/31 ⋅ 0

vs2013 写一份C++ 使用PROTOBUF的案例

vs2013 写一份C++ 使用PROTOBUF的案例 CNETOS 7.2下面也写一份C++ 使用PROTOBUF的案例 DEMO 只需要包含一个PROTO协议打包解包即可,包含REQUIEd字段,REPEATE,OPTIONAL字段,具体可以自定义...

张伟华 ⋅ 03/29 ⋅ 0

在项目中使用Protobuf协议实现数据传输(二)

上篇已经简单的分析了什么是ProtoBuf协议的优缺点、简单的环境配置、项目中的简单使用和一些编写.Proto文件的注意点,下面我们更加深入一下ProtoBuf的语法及高级使用(非常感谢Carson_Ho大神...

大荣言午 ⋅ 05/31 ⋅ 0

用 Maven 实现一个 protobuf 的 Java 例子

原文出处:jihite 1. 介绍Protocol Buffers Protocal Buffers(简称protobuf)是谷歌的一项技术,用于结构化的数据序列化、反序列化,常用于RPC 系统(Remote Procedure Call Protocol System...

jihite ⋅ 05/14 ⋅ 0

Protobuf序列化对象放到redis

安装Protobuf 下载包,3.0+; 解压包; make; make check; make install; 构建模板 指定3.0+版本 生成protof文件: 引入依赖: 如果使用json,引入依赖: 构建对象并序列化放到redis red...

春哥大魔王的博客 ⋅ 04/17 ⋅ 0

gRPC Windows编译应用

gRPC Windows编译 从github上clone出来后进行cmake的编译,参考上面的文档,需要注意的点: 必须安装所有的依赖,包括Perl,Go,YASM,Git,CMake 不要使用--recursive来递归clone,因为墙的...

水海云 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Android JNI 读写Bitmap的方法

Java层创建Bitmap,通过JNI将Bitmap传到C/C++进行处理 Java部分 public static native boolean greenBitmap(Bitmap bitmap); C/C++部分 JNIEXPORT jboolean JNICALL Java_com_test_Test_gree......

国仔饼 ⋅ 19分钟前 ⋅ 0

一次性让你懂async/await,解决回调地狱

什么是async? 欢迎留言讨论 async 函数是 Generator 函数的语法糖。使用 关键字 async 来表示,在函数内部使用 await 来表示异步。相较于 Generator,async 函数的改进在于下面四点: 内置执...

阿K1225 ⋅ 19分钟前 ⋅ 0

angular常用命令

.下载更新操作 1.利用npm下载angular的命令行工具AngularCLI: npm install -g @angular/cli 2.下载jquery: npm install --save jquery 3.更新npm: npm i -g npm 4.更新angular: ng update ......

消散了的诗意 ⋅ 22分钟前 ⋅ 0

window.print 页面打印

定义和用法 print() 方法用于打印当前窗口的内容。 语法 window.print(); window.print() 实际上,是浏览器打印功能菜单的一种程序调用。与点击打印功能菜单一样,不能精确分页,不能设置纸型...

初学者的优化 ⋅ 22分钟前 ⋅ 0

魔兽世界 7.0版本上 PVE装备全攻略

  T套 因为大家应该都会打穿副本的所以具体是哪个boss我就不说了。   T1: 所有套装都在【熔火之心】出   T2: 头原来是在【奥妮克希亚的巢穴】改到黑翼之巢的奈法利安了,腿是在【熔火之...

wangchen1999 ⋅ 23分钟前 ⋅ 0

java.math.BigDecimal使用小结

原文地址 java.math.BigDecimal使用小结 divide方法 使用BigDecimal.divide方法时一定要考虑: 除数是否为0 商是否是无限小数 正确的使用方式 判断除数是否为0,是0做另外的处理逻辑 调用除法...

666B ⋅ 26分钟前 ⋅ 0

关于qstring转char乱码问题。

if (OpenClipboard(NULL)) { HGLOBAL hgClip; EmptyClipboard(); QByteArray byay = FValue.toLocal8Bit(); //转latin编码 char *bochsrc_line = byay.data(); hgClip = GlobalAlloc(GMEM_DD......

backtrackx ⋅ 26分钟前 ⋅ 0

了解SSH加密和连接过程

介绍 SSH或安全shell是安全协议,也是安全管理远程服务器的最常用方式。通过使用多种加密技术,SSH提供了一种机制,用于在双方之间建立加密安全连接,对彼此进行身份验证,以及来回传递命令和...

吴伟祥 ⋅ 32分钟前 ⋅ 0

微信小程序

小程序的全局配置app.json 微信小程序的全局配置保存在app.json文件中。开发者通过使用app.json来配置页面文件(pages)的路径、窗口(window)表现、设定网络超时时间值(networkTimeout)以...

上官清偌 ⋅ 36分钟前 ⋅ 0

【转】百度坐标坐标系之间的转换(JS版代码)

/** * Created by Wandergis on 2015/7/8. * 提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换 *///定义一些常量var x_PI = 3.1415926535897932...

HAVENT ⋅ 37分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部