Protobuf源码与protoc生成代码编译成一个静态库

工程结构:

MyProj
  |-jni
    |-  Android.mk
    |-  Application.mk
    |-  google
        |-  protobuf
        |-      io
        |-      stubs
    |-  proto_gen_src

其中,google为protobuf的源码;proto_gen_src为protoc生成的代码,即:*.pb.cc。

Android.mk

LOCAL_PATH := $(call my-dir)  
include $(CLEAR_VARS)  
CC_LITE_SRC_FILES :=                                        \
google/protobuf/stubs/common.cc                             \
google/protobuf/stubs/once.cc                                \
google/protobuf/extension_set.cc                             \
google/protobuf/generated_message_util.cc                    \
google/protobuf/message_lite.cc                              \
google/protobuf/repeated_field.cc                            \
google/protobuf/wire_format_lite.cc                          \
google/protobuf/io/coded_stream.cc                           \
google/protobuf/io/zero_copy_stream.cc                       \
google/protobuf/io/zero_copy_stream_impl_lite.cc  


# C++ full library  
# =======================================================  
#include $(CLEAR_VARS)  

LOCAL_MODULE := MyProj.ndk
LOCAL_MODULE_TAGS := optional  

LOCAL_CPP_EXTENSION := .cc  

#protobuf源码目录
LOCAL_SRC_FILES += \
$(CC_LITE_SRC_FILES)

#protoc生成代码的目录
MY_CPP_LIST := $(wildcard $(LOCAL_PATH)/proto_gen_src/*.cpp)
MY_CPP_LIST += $(wildcard $(LOCAL_PATH)/proto_gen_src/*.cc)
LOCAL_SRC_FILES += $(MY_CPP_LIST:$(LOCAL_PATH)/%=%)

LOCAL_CFLAGS := -march=armv7-a -mfloat-abi=softfp -DGOOGLE_PROTOBUF_NO_RTTI     #-DGOOGLE_PROTOBUF_NO_RTTI  

include $(BUILD_STATIC_LIBRARY)

Application.mk

APP_STL := gnustl_static  
APP_ABI := armeabi-v7a armeabi  
APP_PROJECT_PATH := ./  
APP_BUILD_SCRIPT := ./jni/Android.mk  

最后在MyProj目录下执行命令:

ndk-build

最后生成的静态库MyProj.ndk.a所在目录为:

MyProj\obj\local\armeabi\MyProj.ndk.a
MyProj\obj\local\armeabi-v7a\MyProj.ndk.a
只编译Protobuf静态库

在上述Android.mk中去掉以下代码:

#protoc生成代码的目录
MY_CPP_LIST := $(wildcard $(LOCAL_PATH)/proto_gen_src/*.cpp)
MY_CPP_LIST += $(wildcard $(LOCAL_PATH)/proto_gen_src/*.cc)
LOCAL_SRC_FILES += $(MY_CPP_LIST:$(LOCAL_PATH)/%=%)
只编译protoc生成代码静态库

在上述Android.mk中去掉以下代码:

#protobuf源码目录
LOCAL_SRC_FILES += \
$(CC_LITE_SRC_FILES)

人生有两种境界:一是痛而不言,二是笑而不语。