如何将最新的 c++ protobuf (3.2) 与 Android NDK 集成/安装?

2023-11-29

早期的protobuf 3.0版本很容易集成。但最新版本3.2存在问题。它也只是编译和构建所有不相关的 Android .cc 文件组件。
如果我们遵循最新分支的路径git for c++ 原型& 按照步骤构建它,然后它生成 15 MB 的 .SO 文件,与之前的 ~1-2 MB 不同。

如何将最新的 protobuf 最佳地集成到 Android 中?


使用跨平台Android 独立工具链并且提供的构建脚本可能会导致由于构建脚本中包含不需要的文件而生成较大的共享库文件(.so)。您可以创建自己的Android.mk文件,其中仅包含库所需的核心部分。生成的库文件可以用作其他 Android 项目中的预构建库。请检查以下步骤以了解创建自己的脚本文件的第二个选项。

  1. 从以下位置下载最新的 Android Google Protobuf 源代码Git 源代码存储库.
  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)

应用程序.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. Run ndk-build里面会生成需要的.so文件libs项目目录的文件夹。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将最新的 c++ protobuf (3.2) 与 Android NDK 集成/安装? 的相关文章

  • 本地管理的广播接收器泄漏?

    当应用程序被系统杀死时 本地 即使用 LocalBroadcastManager 管理 BroadcastReceiver 是否有可能泄漏 我需要它的具体用例是我想在活动的 onCreate onDestroy 中注册 注销 Broadca
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • Android 5 Lollipop 阴影方向或 y 偏移

    是否有可能改变 Y 偏移的阴影方向 现在我有以下布局
  • 使用 twitter API 1.1 在 Android 应用程序中显示 twitter feed

    基本上我想展示这个提要 https en twitter com epl live https en twitter com epl live在我的应用程序中 由于 twitter 更改了其 api 1 1 每个调用都必须经过授权 我发现的
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • android - 如何让按钮每次按下时单击播放声音文件?

    我打开了一个新项目 现在我想做的是 通过按下按钮 我想要播放一个 mp3 文件 而且每次按下按钮时 声音文件都会再次从头开始播放 所以假设 mp3 长 10 秒 我按下按钮 它正在播放 4 秒后我再次按下按钮 声音将再次播放 现在我想知道的
  • 将 log4net 与 Autofac 结合使用

    我正在尝试将 log4net 与 Autofac 一起使用 我粘贴了这段代码http autofac readthedocs org en latest examples log4net html http autofac readthed
  • onStart() 到底做了什么? - 安卓[重复]

    这个问题在这里已经有答案了 一段时间以来 我一直想知道 onStart 函数在 android 生命周期中的确切作用 网上的大多数资源只是说 它在您的活动在屏幕上可见之前被调用 但到目前为止我所做的应用程序我从未使用过onStart 我在
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • Android - 检测视图上的双击和三次点击

    我一直在尝试构建一个可以检测双敲击和三敲击的敲击检测器 在我的努力失败后 我在网上搜索了很长时间以找到可以使用的东西 但没有运气 奇怪的是 像这样的图书馆如此稀缺 有什么帮助吗 你可以尝试这样的事情 尽管我通常建议不要使用三次点击作为一种模
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • 如何从另一个活动更新 Recyclerview 数据

    我有两个活动 MainActivity 和 Addlogactivity 我正在更新 Addlogactivity 中的数据 该数据应显示在 mainactivity recyclerview 中 数据未在数据库中更新 MianActivi
  • 将主题应用到 v7 支持操作栏

    我正在使用support v7库来实现ActionBar在我的应用程序中 我的styles xml file
  • android.view.WindowLeaked - 使用对话框和新意图时

    我已经尝试了 stackoverflow 上提供的所有可能的解决方案 但我仍然在 logcat 中遇到此错误 活动 com xyz MainActivity 泄露了最初在此处添加的窗口 com android internal policy

随机推荐

  • 在PyQt5中,如何将普通的QLineEdit(文本框)转换为完美的大写/大写QLineEdit框?

    如何转换我的QLineEdit 入门级大写或全部大写 如果我在文本框 QLineEdit 中输入字符串 它会根据用户定义的方法自动将输入字符串转换或格式化 大写或大写 import sys from PyQt5 QtWidgets impo
  • Visual Studio 初始化时状态栏中出现奇怪的图标

    当我构建项目时 Visual Studio 2015 花了很长时间 状态栏如下所示 该图标是动画的 箭头向下移动 而小盒子落入开放的正方形中 如果我不得不猜测 这意味着 VS 正在尝试下载某些东西 包 但卡在某个地方 这个图标到底是什么意思
  • 如何在 IntelliJ IDE 中将 Spark 与 Scala 项目集成?

    我正在使用 IntelliJ IDE 来玩 Scala 和 Spark 在此 IDE 中 我使用 Scala 对象创建了一个 Scala 项目 见图 我使用了示例回归代码web site 我还以非 Maven 用户身份从 GitHub 下载
  • codeigniter 默认控制器 url 路由

    我正在组建一个简单的网站 并希望 URL 的工作方式与 facebook 类似 因此通过输入 domain com username 我将获得用户个人资料 我已经可以这样做了 登录的用户个人资料位于 domain com 其他用户个人资料位
  • 如何在java中从10到1倒序打印计数?

    我想打印相反的计数顺序 我怎样才能在java中做到这一点 我尝试了一些代码但没有成功 import java util public class reversecount public static void main String arg
  • tkinter 中的标题栏菜单

    我想我们大多数人一定见过命令提示符 Windows 以及当我们打开它并单击它的图标时它会显示一个菜单 我们可以用 tkinter 做类似的事情吗 这不是正常的菜单栏 这是命令提示符之一的说明 这只是一个解决方法的示例 无需您自己进行所有窗口
  • java linkedhashmap迭代

    我有两个哈希图 LinkedHashMap
  • 如何在java应用程序中显示html?

    现在我正在致力于用 Java 实现浏览器 我需要在 JFrame 窗口内显示网站的内容 提供 url 地址 有没有一种简单的方法可以做到这一点 我尝试了JEditorPane 但它只支持HTML 3 2 所以网站的内容看起来很奇怪 Than
  • Java - 连接关闭后无法使用 ResultSet

    我在关闭与 MySQL 的连接时遇到问题 我收到错误 java sql SQLException 结果集关闭后不允许执行操作 My code public static ResultSet sqlquery String query Res
  • 依赖注入和实体框架

    我正在使用 MVVM light 及其 Ioc 来做一个 wpf 应用程序SimpleIoc 我实现了这样的存储库模式 public interface ICrud
  • 解释双重检查锁定中的竞争条件

    void undefined behaviour with double checked locking if resource ptr 1 std lock guard
  • C# - 文件上传到服务器后损坏

    我使用以下源代码上传文件excel和pdf 但是将文件移动到服务器后 文件已损坏 我认为问题出在编码过程上Encoding UTF8 GetBytes sourceStream ReadToEnd 但我不知道如何解决 public stat
  • 在 Android 中启动 GPS 设置屏幕

    以下代码在三星设备中启动 GPS 设置屏幕 但在 HTC 设备中启动设置的安全屏幕 我如何编写代码 以便它独立于设备启动 GPS 屏幕 请帮助是否有任何替代解决方案 final ComponentName toLaunch new Comp
  • SQL 错误:ORA-00942 表或视图不存在

    我使用 SQL Developer 在创建用户并使用所有所需权限与该用户建立另一个连接后 使用系统用户与数据库建立了连接 但是当我尝试继续以下操作时 出现 SQL 错误 ORA 00942表或视图不存在 INSERT INTO custom
  • 创建每列有多个标题的数据框并在循环中填充数据框

    我想创建一个每列有多个标题的 Pandas 数据框 并使用循环中的数据逐行填充数据框 我以前创建过数据框 但这对于我真正想做的事情来说似乎非常复杂 而且我不知道从哪里开始 Example step list range 1 5 for i
  • 从内容脚本访问窗口变量[重复]

    这个问题在这里已经有答案了 我有一个 Chrome 扩展程序 它试图在每个浏览的 URL 以及每个浏览器 URL 的每个 iframe 上查找变量是否存在window my variable name exists 所以我写了这个小内容脚本
  • pygame.display.toggle_fulscreen() 不起作用

    所以 我试图让 python 切换到全屏 现在我认为我需要做的就是 screen pygame display toggle fullscreen 我认为这已经足够了 但它给了我这个traceback error Traceback mos
  • Hive 表中匹配大小的随机样本

    我有一个蜂巢表activity有柱子userid itemid and rating 可能的评级为 1 和 0 其中正面评级 1 多于负面评级 0 我需要提取一个正面和负面评级数量大致相等的样本 我需要这个样本尽可能大 因此想要对所有负面评
  • C 中单个竖线的含义是什么 [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 有人向我展示了以下代码片段并询问它的含义 if pFCT gt FBMap VBQNum
  • 如何将最新的 c++ protobuf (3.2) 与 Android NDK 集成/安装?

    早期的protobuf 3 0版本很容易集成 但最新版本3 2存在问题 它也只是编译和构建所有不相关的 Android cc 文件组件 如果我们遵循最新分支的路径git for c 原型 按照步骤构建它 然后它生成 15 MB 的 SO 文