protobuf使用(一)android ndk 編譯 protobuf-3.6.x windows
阿新 • • 發佈:2018-12-20
首先建議大家看好版本,環境,有可能因為小的變化會造成編譯有問題:
我的環境是
PC OS: windows10(沒辦法暫時沒機器);
NDK: android-ndk-r17b-windows-x86_64
proto :
syntax = "proto3";
package tutorial;
message Person {
int32 id = 1;
string name = 2;
string email = 3;
}
protoc_person.bat 批處理檔案:
protoc --cpp_out=./ person.proto
具體步驟:
1.下載原始碼
解壓下載的原始碼,找到src目錄,C++的原始碼在這個目錄
2.在src目錄,新建 Application.mk
APP_MODULES := protobuf
APP_PLATFORM := android-19
APP_ABI := armeabi-v7a
APP_STL := c++_static
APP_OPTIM := release
3.在src目錄,新建 Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := protobuf LOCAL_CFLAGS := -std=c++11 -fexceptions -frtti LOCAL_MODULE_FILENAME := libprotobuf LOCAL_SRC_FILES := google/protobuf/stubs/bytestream.cc \ google/protobuf/stubs/bytestream.h \ google/protobuf/stubs/common.cc \ google/protobuf/stubs/hash.h \ google/protobuf/stubs/int128.cc \ google/protobuf/stubs/int128.h \ google/protobuf/stubs/io_win32.cc \ google/protobuf/stubs/io_win32.h \ google/protobuf/stubs/map_util.h \ google/protobuf/stubs/mathutil.h \ google/protobuf/stubs/status.cc \ google/protobuf/stubs/status.h \ google/protobuf/stubs/status_macros.h \ google/protobuf/stubs/statusor.cc \ google/protobuf/stubs/statusor.h \ google/protobuf/stubs/stringpiece.cc \ google/protobuf/stubs/stringpiece.h \ google/protobuf/stubs/stringprintf.cc \ google/protobuf/stubs/stringprintf.h \ google/protobuf/stubs/structurally_valid.cc \ google/protobuf/stubs/strutil.cc \ google/protobuf/stubs/strutil.h \ google/protobuf/stubs/time.cc \ google/protobuf/stubs/time.h \ google/protobuf/arena.cc \ google/protobuf/arenastring.cc \ google/protobuf/extension_set.cc \ google/protobuf/generated_message_util.cc \ google/protobuf/generated_message_table_driven_lite.h \ google/protobuf/generated_message_table_driven_lite.cc \ google/protobuf/implicit_weak_message.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/coded_stream_inl.h \ google/protobuf/io/zero_copy_stream.cc \ google/protobuf/io/zero_copy_stream_impl_lite.cc \ google/protobuf/any.pb.cc \ google/protobuf/api.pb.cc \ google/protobuf/stubs/mathlimits.cc \ google/protobuf/stubs/mathlimits.h \ google/protobuf/any.cc \ google/protobuf/descriptor.cc \ google/protobuf/descriptor_database.cc \ google/protobuf/descriptor.pb.cc \ google/protobuf/duration.pb.cc \ google/protobuf/dynamic_message.cc \ google/protobuf/empty.pb.cc \ google/protobuf/extension_set_heavy.cc \ google/protobuf/field_mask.pb.cc \ google/protobuf/generated_message_reflection.cc \ google/protobuf/generated_message_table_driven_lite.h \ google/protobuf/generated_message_table_driven.cc \ google/protobuf/map_field.cc \ google/protobuf/message.cc \ google/protobuf/reflection_internal.h \ google/protobuf/reflection_ops.cc \ google/protobuf/service.cc \ google/protobuf/source_context.pb.cc \ google/protobuf/struct.pb.cc \ google/protobuf/stubs/substitute.cc \ google/protobuf/stubs/substitute.h \ google/protobuf/text_format.cc \ google/protobuf/timestamp.pb.cc \ google/protobuf/type.pb.cc \ google/protobuf/unknown_field_set.cc \ google/protobuf/wire_format.cc \ google/protobuf/wrappers.pb.cc \ google/protobuf/io/gzip_stream.cc \ google/protobuf/io/printer.cc \ google/protobuf/io/strtod.cc \ google/protobuf/io/tokenizer.cc \ google/protobuf/io/zero_copy_stream_impl.cc \ google/protobuf/compiler/importer.cc \ google/protobuf/compiler/parser.cc \ google/protobuf/util/delimited_message_util.cc \ google/protobuf/util/field_comparator.cc \ google/protobuf/util/field_mask_util.cc \ google/protobuf/util/internal/constants.h \ google/protobuf/util/internal/datapiece.cc \ google/protobuf/util/internal/datapiece.h \ google/protobuf/util/internal/default_value_objectwriter.cc \ google/protobuf/util/internal/default_value_objectwriter.h \ google/protobuf/util/internal/error_listener.cc \ google/protobuf/util/internal/error_listener.h \ google/protobuf/util/internal/expecting_objectwriter.h \ google/protobuf/util/internal/field_mask_utility.cc \ google/protobuf/util/internal/field_mask_utility.h \ google/protobuf/util/internal/json_escaping.cc \ google/protobuf/util/internal/json_escaping.h \ google/protobuf/util/internal/json_objectwriter.cc \ google/protobuf/util/internal/json_objectwriter.h \ google/protobuf/util/internal/json_stream_parser.cc \ google/protobuf/util/internal/json_stream_parser.h \ google/protobuf/util/internal/location_tracker.h \ google/protobuf/util/internal/mock_error_listener.h \ google/protobuf/util/internal/object_location_tracker.h \ google/protobuf/util/internal/object_source.h \ google/protobuf/util/internal/object_writer.cc \ google/protobuf/util/internal/object_writer.h \ google/protobuf/util/internal/protostream_objectsource.cc \ google/protobuf/util/internal/protostream_objectsource.h \ google/protobuf/util/internal/protostream_objectwriter.cc \ google/protobuf/util/internal/protostream_objectwriter.h \ google/protobuf/util/internal/proto_writer.cc \ google/protobuf/util/internal/proto_writer.h \ google/protobuf/util/internal/structured_objectwriter.h \ google/protobuf/util/internal/type_info.cc \ google/protobuf/util/internal/type_info.h \ google/protobuf/util/internal/type_info_test_helper.cc \ google/protobuf/util/internal/type_info_test_helper.h \ google/protobuf/util/internal/utility.cc \ google/protobuf/util/internal/utility.h \ google/protobuf/util/json_util.cc \ google/protobuf/util/message_differencer.cc \ google/protobuf/util/time_util.cc \ google/protobuf/util/type_resolver_util.cc LOCAL_EXPORT_C_INCLUDES := LOCAL_EXPORT_LDLIBS := LOCAL_C_INCLUDES := $(LOCAL_PATH) \ $(LOCAL_PATH)/src LOCAL_LDLIBS := -llog -lz #include $(BUILD_SHARED_LIBRARY) include $(BUILD_STATIC_LIBRARY)
【注意】: 每個版本可能需要編譯的原始檔不同,要編譯的原始碼在src目錄下的Makefile.am檔案。比如你要編譯protobuf-lite,在Makefile.am檔案中搜索libprotobuf_lite_la_SOURCES,將對應的程式碼直接拷貝到LOCAL_SRC_FILES := 即可。
4.編譯:切記用命令列編譯 cd 到src 目錄,執行
ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk NDK_APPLICATION_MK=./Application.mk
不要用android studio 編譯,可能會出亂七八糟在問題造成編譯不過,最好在linux下編譯吧。
遇到的問題:
問題1:common.cc中缺少 HAVE_PTHREAD的定義。
解決方案:在common.h中定義一下即可,如下:
#ifndef HAVE_PTHREAD
#define HAVE_PTHREAD
#endif
如果您需要靜態庫,只需要將Android.mk檔案中 BUILD_SHARED_LIBRARY修改為 BUILD_STATIC_LIBRARY即可。
完整包下載