下载源码
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 */
#define HASH_MAP_CLASS unordered_map
/* the location of or */
#define HASH_MAP_H
/* the namespace of hash_map/hash_set */
#define HASH_NAMESPACE std::tr1
/* the name of */
#define HASH_SET_CLASS unordered_set
/* the location of or */
#define HASH_SET_H
/* Define to 1 if you have the header file. */
#define HAVE_DLFCN_H 1
/* Define to 1 if you have the 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 header file. */
#define HAVE_INTTYPES_H 1
/* Define to 1 if you have the header file. */
#define HAVE_LIMITS_H 1
/* Define to 1 if you have the 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 header file. */
#define HAVE_STDINT_H 1
/* Define to 1 if you have the 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 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 header file. */
#define HAVE_SYS_STAT_H 1
/* Define to 1 if you have the header file. */
#define HAVE_SYS_TYPES_H 1
/* Define to 1 if you have the 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 "[email protected]"
/* 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
#define GOOGLE_PROTOBUF_HASH_NAMESPACE std::tr1
#define GOOGLE_PROTOBUF_HASH_SET_CLASS unordered_set
#define GOOGLE_PROTOBUF_HASH_SET_H
#define GOOGLE_PROTOBUF_HAVE_HASH_MAP 1
#define GOOGLE_PROTOBUF_HAVE_HASH_SET 1
来源:http://transing.xyz/2015/07/23/build-protobuf-with-ndk-under-windows/