原文:http://transing.xyz/2015/07/23/build-protobuf-with-ndk-under-windows/
git clone https://github.com/google/protobuf.git git checkout v3.0.0-alpha-3.1
在protobuf文件夹下建立build.bat,内容如下
set PATH=%PATH%;E:\devel\android-ndk-r9d ndk-build.cmd pause
在protobuf文件夹下新建jni文件夹,然后新建Android.mk文件,里面内容如如下(这里的内容主要是参考src/Makefile.am文件得到的)
# Copyright 2006 The Android Open Source Project LOCAL_PATH := $(call my-dir) SRC_PATH := ../src include $(CLEAR_VARS) LOCAL_CFLAGS:= -DHAVE_PTHREAD=1 LOCAL_SRC_FILES:= \ $(SRC_PATH)/google/protobuf/stubs/atomicops_internals_x86_gcc.cc \ $(SRC_PATH)/google/protobuf/stubs/atomicops_internals_x86_msvc.cc \ $(SRC_PATH)/google/protobuf/stubs/common.cc \ $(SRC_PATH)/google/protobuf/stubs/once.cc \ $(SRC_PATH)/google/protobuf/stubs/stringprintf.cc \ $(SRC_PATH)/google/protobuf/arena.cc \ $(SRC_PATH)/google/protobuf/arenastring.cc \ $(SRC_PATH)/google/protobuf/extension_set.cc \ $(SRC_PATH)/google/protobuf/generated_message_util.cc \ $(SRC_PATH)/google/protobuf/message_lite.cc \ $(SRC_PATH)/google/protobuf/repeated_field.cc \ $(SRC_PATH)/google/protobuf/wire_format_lite.cc \ $(SRC_PATH)/google/protobuf/io/coded_stream.cc \ $(SRC_PATH)/google/protobuf/io/zero_copy_stream.cc \ $(SRC_PATH)/google/protobuf/io/zero_copy_stream_impl_lite.cc \ $(SRC_PATH)/google/protobuf/any.pb.cc \ $(SRC_PATH)/google/protobuf/api.pb.cc \ $(SRC_PATH)/google/protobuf/any.cc \ $(SRC_PATH)/google/protobuf/descriptor.cc \ $(SRC_PATH)/google/protobuf/descriptor_database.cc \ $(SRC_PATH)/google/protobuf/descriptor.pb.cc \ $(SRC_PATH)/google/protobuf/duration.pb.cc \ $(SRC_PATH)/google/protobuf/dynamic_message.cc \ $(SRC_PATH)/google/protobuf/empty.pb.cc \ $(SRC_PATH)/google/protobuf/extension_set_heavy.cc \ $(SRC_PATH)/google/protobuf/field_mask.pb.cc \ $(SRC_PATH)/google/protobuf/generated_message_reflection.cc \ $(SRC_PATH)/google/protobuf/map_field.cc \ $(SRC_PATH)/google/protobuf/message.cc \ $(SRC_PATH)/google/protobuf/reflection_ops.cc \ $(SRC_PATH)/google/protobuf/service.cc \ $(SRC_PATH)/google/protobuf/source_context.pb.cc \ $(SRC_PATH)/google/protobuf/struct.pb.cc \ $(SRC_PATH)/google/protobuf/stubs/structurally_valid.cc \ $(SRC_PATH)/google/protobuf/stubs/strutil.cc \ $(SRC_PATH)/google/protobuf/stubs/substitute.cc \ $(SRC_PATH)/google/protobuf/text_format.cc \ $(SRC_PATH)/google/protobuf/timestamp.pb.cc \ $(SRC_PATH)/google/protobuf/type.pb.cc \ $(SRC_PATH)/google/protobuf/unknown_field_set.cc \ $(SRC_PATH)/google/protobuf/wire_format.cc \ $(SRC_PATH)/google/protobuf/wrappers.pb.cc \ $(SRC_PATH)/google/protobuf/io/gzip_stream.cc \ $(SRC_PATH)/google/protobuf/io/printer.cc \ $(SRC_PATH)/google/protobuf/io/strtod.cc \ $(SRC_PATH)/google/protobuf/io/tokenizer.cc \ $(SRC_PATH)/google/protobuf/io/zero_copy_stream_impl.cc \ $(SRC_PATH)/google/protobuf/compiler/importer.cc \ $(SRC_PATH)/google/protobuf/compiler/parser.cc LOCAL_C_INCLUDES:= \ $(LOCAL_PATH)/../src \ $(LOCAL_PATH)/../ LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -lz LOCAL_SHARED_LIBRARIES:= LOCAL_MODULE:= protobuf LOCAL_MODULE_TAGS := optional include $(BUILD_SHARED_LIBRARY)
再建立Application.mk文件,内容如下
APP_MODULES := protobuf APP_PLATFORM := android-9 APP_ABI := armeabi-v7a APP_STL := gnustl_static APP_OPTIM := release APP_CPPFLAGS := -fexceptions -frtti
过程中会提示缺少config.h和pbconfig.h,这两个文件是跑configure后才生成,从linux编译一次protobuf生成后拷贝到windows就好了。
或者自己手动建立,config.h的内容如下
/* config.h. Generated from config.h.in by configure. */ /* config.h.in. Generated from configure.ac by autoheader. */ /* the name of <hash_map> */ #define HASH_MAP_CLASS unordered_map /* the location of <unordered_map> or <hash_map> */ #define HASH_MAP_H <tr1/unordered_map> /* the namespace of hash_map/hash_set */ #define HASH_NAMESPACE std::tr1 /* the name of <hash_set> */ #define HASH_SET_CLASS unordered_set /* the location of <unordered_set> or <hash_set> */ #define HASH_SET_H <tr1/unordered_set> /* Define to 1 if you have the <dlfcn.h> header file. */ #define HAVE_DLFCN_H 1 /* Define to 1 if you have the <fcntl.h> header file. */ #define HAVE_FCNTL_H 1 /* Define to 1 if you have the `ftruncate' function. */ #define HAVE_FTRUNCATE 1 /* 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 to 1 if you have the <inttypes.h> header file. */ #define HAVE_INTTYPES_H 1 /* Define to 1 if you have the <limits.h> header file. */ #define HAVE_LIMITS_H 1 /* Define to 1 if you have the <memory.h> header file. */ #define HAVE_MEMORY_H 1 /* Define to 1 if you have the `memset' function. */ #define HAVE_MEMSET 1 /* Define to 1 if you have the `mkdir' function. */ #define HAVE_MKDIR 1 /* Define if you have POSIX threads libraries and header files. */ #define HAVE_PTHREAD 1 /* Define to 1 if you have the <stdint.h> header file. */ #define HAVE_STDINT_H 1 /* Define to 1 if you have the <stdlib.h> header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the `strchr' function. */ #define HAVE_STRCHR 1 /* Define to 1 if you have the `strerror' function. */ #define HAVE_STRERROR 1 /* Define to 1 if you have the <strings.h> header file. */ #define HAVE_STRINGS_H 1 /* Define to 1 if you have the <string.h> header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the `strtol' function. */ #define HAVE_STRTOL 1 /* Define to 1 if you have the <sys/stat.h> header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the <sys/types.h> header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the <unistd.h> header file. */ #define HAVE_UNISTD_H 1 /* Enable classes using zlib compression. */ #define HAVE_ZLIB 1 /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #define LT_OBJDIR ".libs/" /* Name of package */ #define PACKAGE "protobuf" /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "protobuf@googlegroups.com" /* Define to the full name of this package. */ #define PACKAGE_NAME "Protocol Buffers" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "Protocol Buffers 3.0.0-alpha-3" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "protobuf" /* Define to the home page for this package. */ #define PACKAGE_URL "" /* Define to the version of this package. */ #define PACKAGE_VERSION "3.0.0-alpha-3" /* Define to necessary symbol if this constant uses a non-standard name on your system. */ /* #undef PTHREAD_CREATE_JOINABLE */ /* 64bit enabled */ /* #undef SOLARIS_64BIT_ENABLED */ /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # define _ALL_SOURCE 1 #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif /* Enable threading extensions on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # define _POSIX_PTHREAD_SEMANTICS 1 #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # define _TANDEM_SOURCE 1 #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # define __EXTENSIONS__ 1 #endif /* Version number of package */ #define VERSION "3.0.0-alpha-3" /* Define to 1 if on MINIX. */ /* #undef _MINIX */ /* Define to 2 if the system does not provide POSIX.1 features except with this defined. */ /* #undef _POSIX_1_SOURCE */ /* Define to 1 if you need to in order for `stat' and other things to work. */ /* #undef _POSIX_SOURCE */
pbconfig.h内容如下
#define GOOGLE_PROTOBUF_HASH_MAP_CLASS unordered_map #define GOOGLE_PROTOBUF_HASH_MAP_H <tr1/unordered_map> #define GOOGLE_PROTOBUF_HASH_NAMESPACE std::tr1 #define GOOGLE_PROTOBUF_HASH_SET_CLASS unordered_set #define GOOGLE_PROTOBUF_HASH_SET_H <tr1/unordered_set> #define GOOGLE_PROTOBUF_HAVE_HASH_MAP 1 #define GOOGLE_PROTOBUF_HAVE_HASH_SET 1
相关推荐
### Windows 下 Android 编译 Protobuf 的步骤及详解 #### 一、下载 Protobuf 源代码 在开始编译之前,首先需要从官方仓库获取最新版本的 Protobuf 源代码。通常可以通过 Git 克隆或者直接下载压缩包的方式进行...
在交叉编译过程中,可能遇到一些编译错误,本文指出在尝试使用protobuf 3.0版本时遇到了难以解决的问题。错误信息表明在构造函数中存在未定义的成员变量。由于对protobuf不够熟悉,以及缺乏有效的在线资源解决这一...
本文将深入探讨如何使用Android NDK(Native Development Kit)来编译适用于Android平台的eXosip库,包括静态库和动态库的构建过程。 首先,eXosip是基于OSI(Open Systems Interconnection)模型的SIP协议栈,它是...
在这种情况下,我们是在x86或x86_64的主机上使用NDK编译出适用于ARM架构的Python可执行文件。 "ndk交叉编译python"的过程大致分为以下几个步骤: 1. **安装NDK**:首先,你需要下载并安装Android NDK。NDK提供了一...
4. **执行编译**:在`Android.mk`所在的目录下,执行`ndk-build`命令,这将会生成一个适用于Android平台的静态库文件(通常为`libiconv.a`)。 5. **链接库到项目**:将生成的`libiconv.a`库添加到你的Android项目...
4. **编译源码**:使用NDK的交叉编译功能,生成适用于Android的静态或动态库。 5. **JNI接口**:在Java层创建JNI接口,调用C++编译的库函数。 6. **运行与调试**:在模拟器或真机上运行测试,确保移植成功。 **注意...
从Android NDK安装ARM交叉编译工具链涉及的技术领域包括Android开发、交叉编译、NDK使用、ARM架构以及Linux环境下的编译工具使用。以下是详细的知识点解析: Android NDK(Native Development Kit)是Android应用...
在这个编译工程中,我们将深入探讨如何在 Android 环境下构建和集成 GMSSL 3.0 库,以便为 Android 应用程序提供安全的网络通信功能。 首先,要理解 GMSSL 3.0 的核心功能,它主要提供了加密和解密、数字签名、密钥...
通过以上步骤,你可以在Ubuntu环境下成功搭建Android NDK编译环境,开始进行原生代码的开发工作。记得保持NDK和SDK的更新,以获取最新的特性和修复。在实际开发中,可能会遇到各种问题,如库冲突、链接错误等,这时...
这个压缩包“android-ndk-r25b-windows.zip”包含了NDK的第25个版本,专为Windows操作系统设计。NDK的主要功能是让开发者能够在Android应用中使用原生代码,例如C、C++,以实现高性能计算或利用硬件加速等功能。 **...
NDK是Android应用开发中的一个重要组成部分,它允许开发者使用原生代码(如C、C++)来编写部分应用程序,从而利用底层的硬件性能,提高程序运行效率,尤其是在处理图形计算、物理模拟和游戏引擎等高性能需求的场景下...
在 Windows 环境下使用 Eclipse 开发 Android 应用时,如果需要利用 C 或 C++ 的功能,通常会涉及到 Android NDK 的使用。为了更好地整合开发流程,可以将 Cygwin 和 Eclipse 结合起来使用,实现更加高效的开发体验...
使用“android-ndk-r26b-windows.zip”,开发者需要解压到指定目录,并将其添加到Android Studio的环境变量中,以便在构建过程中使用。同时,Android Studio提供了对NDK的集成支持,可以在IDE内进行NDK相关的开发和...
通过cygwin,一个提供Linux命令行环境的Windows软件,开发者可以在Windows下模拟Linux环境进行NDK编译,使得整个流程更加顺畅。 在使用NDK和FFmpeg进行视频编辑动态库编译时,首先需要配置NDK环境,包括设置路径、...
在这个场景中,我们将探讨如何在Android环境下使用NDK(Native Development Kit)编译Curl库源码。 首先,NDK是Google提供的一个工具集,允许开发者在Android应用中集成原生代码。通过NDK,我们可以编写C和C++代码...
《Android NDK R6B 下编译的x264源码详解与移植实践》 在移动设备上实现高效的视频编码技术,x264是一个关键的开源项目,它提供了高效的H.264视频编码算法。在Android平台上,通过NDK(Native Development Kit)...
如果你的项目依赖于GCC的某些特性或者你需要继续维护使用GCC编译的旧代码库,"android-ndk-r17c-windows-x86_64.zip" 将是你理想的选项。在升级到更高版本的NDK之前,你需要确保你的代码和依赖项与Clang兼容,或者...
在Android应用开发中,NDK扮演着至关重要的角色,它允许开发者使用原生代码(如C和C++)来编写部分应用,以提高性能、利用硬件加速功能或复用现有的C/C++库。 1. **JNI(Java Native Interface)**: JNI是Java...
脚本中描述了如何编译protobuf,包括了ubuntu和android版本
iperf 2 ,3 的android 平台移植笔记,ndk 选择,交叉编译工具链的编译和配置,编译结果的验证,常见错误的处理方法。工作实践中的总结。