【问题标题】:How to integrate/install latest c++ protobuf (3.2) with Android NDK?如何将最新的 c++ protobuf (3.2) 与 Android NDK 集成/安装?
【发布时间】:2017-07-16 11:19:37
【问题描述】:

早期的 protobuf 版本 3.0 很容易集成。但是最新版本 3.2 存在问题。它也简单地编译和构建所有不相关的 Android .cc 文件组件。
如果我们按照git for c++ proto 中最新分支的路径并按照步骤构建它,那么它会生成 15 MB 的 .SO 文件,而不像之前的大约 1-2 MB。

如何以最佳方式将最新的 protobuf 集成到 Android?

【问题讨论】:

    标签: android c++ compilation cross-compiling protobuf-c


    【解决方案1】:

    使用跨平台Android Standalone Tool chain 和提供的构建脚本可能会导致共享库文件(.so) 的大小较大,这是由于构建脚本中包含不需要的文件而生成的。您可以创建自己的Android.mk 文件,其中仅包含必需的文件图书馆的核心部分。生成的库文件可以用作其他 Android 项目中的预构建库。请检查以下步骤以了解创建自己的脚本文件的第二个选项。

    1. Git Source Repository下载最新的Android Google Protobuf源代码。
    2. 创建新的 Android 应用程序项目。在应用程序项目中按名称 jni 创建目录。
    3. 从下载的源目录运行以下命令。

    ./autogen.sh

    ./配置

    1. 将下载的源代码放在jni目录中。
    2. 将下面的 Android.mk 和 Application.mk 文件放在 jni 目录中。

    Android.mk

        LOCAL_PATH := $(call my-dir)
        include $(CLEAR_VARS)
        c_includes := $(LOCAL_PATH)
        LOCAL_MODULE := libprotobuf      
    
        LOCAL_SRC_FILES := \
        google/protobuf/arena.cc \
        google/protobuf/arenastring.cc \
        google/protobuf/extension_set.cc \
        google/protobuf/generated_message_util.cc \
        google/protobuf/io/coded_stream.cc \
        google/protobuf/io/zero_copy_stream.cc \
        google/protobuf/io/zero_copy_stream_impl_lite.cc \
        google/protobuf/message_lite.cc \
        google/protobuf/repeated_field.cc \
        google/protobuf/stubs/atomicops_internals_x86_gcc.cc \
        google/protobuf/stubs/atomicops_internals_x86_msvc.cc \
        google/protobuf/stubs/bytestream.cc \
        google/protobuf/stubs/common.cc \
        google/protobuf/stubs/int128.cc \
        google/protobuf/stubs/once.cc \
        google/protobuf/stubs/status.cc \
        google/protobuf/stubs/statusor.cc \
        google/protobuf/stubs/stringpiece.cc \
        google/protobuf/stubs/stringprintf.cc \
        google/protobuf/stubs/structurally_valid.cc \
        google/protobuf/stubs/strutil.cc \
        google/protobuf/stubs/time.cc \
        google/protobuf/wire_format_lite.cc \
        google/protobuf/any.cc \
        google/protobuf/any.pb.cc \
        google/protobuf/api.pb.cc \
        google/protobuf/compiler/importer.cc \
        google/protobuf/compiler/parser.cc \
        google/protobuf/descriptor.cc \
        google/protobuf/descriptor.pb.cc \
        google/protobuf/descriptor_database.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/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/map_field.cc \
        google/protobuf/message.cc \
        google/protobuf/reflection_ops.cc \
        google/protobuf/service.cc \
        google/protobuf/source_context.pb.cc \
        google/protobuf/struct.pb.cc \
        google/protobuf/stubs/mathlimits.cc \
        google/protobuf/stubs/substitute.cc \
        google/protobuf/text_format.cc \
        google/protobuf/timestamp.pb.cc \
        google/protobuf/type.pb.cc \
        google/protobuf/unknown_field_set.cc \
        google/protobuf/util/field_comparator.cc \
        google/protobuf/util/field_mask_util.cc \
        google/protobuf/util/internal/datapiece.cc \
        google/protobuf/util/internal/default_value_objectwriter.cc \
        google/protobuf/util/internal/error_listener.cc \
        google/protobuf/util/internal/field_mask_utility.cc \
        google/protobuf/util/internal/json_escaping.cc \
        google/protobuf/util/internal/json_objectwriter.cc \
        google/protobuf/util/internal/json_stream_parser.cc \
        google/protobuf/util/internal/object_writer.cc \
        google/protobuf/util/internal/proto_writer.cc \
        google/protobuf/util/internal/protostream_objectsource.cc \
        google/protobuf/util/internal/protostream_objectwriter.cc \
        google/protobuf/util/internal/type_info.cc \
        google/protobuf/util/internal/type_info_test_helper.cc \
        google/protobuf/util/internal/utility.cc \
        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 \
        google/protobuf/wire_format.cc \
        google/protobuf/wrappers.pb.cc \
        google/protobuf/compiler/code_generator.cc      \
        google/protobuf/compiler/command_line_interface.cc      \
        google/protobuf/compiler/cpp/cpp_enum.cc      \
        google/protobuf/compiler/cpp/cpp_enum_field.cc      \
        google/protobuf/compiler/cpp/cpp_extension.cc      \
        google/protobuf/compiler/cpp/cpp_field.cc      \
        google/protobuf/compiler/cpp/cpp_file.cc      \
        google/protobuf/compiler/cpp/cpp_generator.cc      \
        google/protobuf/compiler/cpp/cpp_helpers.cc      \
        google/protobuf/compiler/cpp/cpp_map_field.cc      \
        google/protobuf/compiler/cpp/cpp_message.cc      \
        google/protobuf/compiler/cpp/cpp_message_field.cc      \
        google/protobuf/compiler/cpp/cpp_primitive_field.cc      \
        google/protobuf/compiler/cpp/cpp_service.cc      \
        google/protobuf/compiler/cpp/cpp_string_field.cc      \
        google/protobuf/compiler/plugin.cc      \
        google/protobuf/compiler/plugin.pb.cc      \
        google/protobuf/compiler/python/python_generator.cc      \
        google/protobuf/compiler/ruby/ruby_generator.cc      \
        google/protobuf/compiler/subprocess.cc      \
        google/protobuf/compiler/zip_writer.cc      \
    
    
        LOCAL_CFLAGS := -D GOOGLE_PROTOBUF_NO_RTTI=1
        LOCAL_CPPFLAGS := -std=c++11
        LOCAL_C_INCLUDES = $(LOCAL_PATH)/android 
        LOCAL_C_INCLUDES += ${ANDROID_NDK}/sources/cxx-stl/gnu-        libstdc++/4.8/include
        LOCAL_LDLIBS += -lz
        LOCAL_EXPORT_LDLIBS += -lz
        LOCAL_EXPORT_CFLAGS := $(LOCAL_CFLAGS)
        LOCAL_EXPORT_CPPFLAGS := $(LOCAL_CPPFLAGS)
        LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)
    
    
        include $(BUILD_SHARED_LIBRARY)
    

    Application.mk

    APP_STL :=gnustl_shared # gnustl_static
    NDK_TOOLCHAIN_VERSION := 4.9
    APP_ABI := all
    LIBCXX_FORCE_REBUILD := true
    APP_PLATFORM:=android-9
    NDK_DEBUG:=1
    
    1. 运行ndk-build,将在项目目录的libs文件夹中生成所需的.so文件。

    【讨论】:

    • 如何使用 adb shell 或类似的东西通过终端在手机中安装 protobuf?我的手机有protobuf 3.0.0,但我想升级版本。我只是不知道如何为Android(Linux系统级别)构建protobuf
    • 您好,现在使用的是 CMakeLists.txt 而不是 Android.mk,您能否提供一些关于如何使用 cmakelists 执行此操作的提示?
    猜你喜欢
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 2019-07-24
    • 2015-01-14
    • 2013-06-13
    • 1970-01-01
    相关资源
    最近更新 更多