Android NDK开发详解之针对中间件供应商的建议

这篇具有很好参考价值的文章主要介绍了Android NDK开发详解之针对中间件供应商的建议。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

分发使用 NDK 构建的中间件会引发其他问题,但应用开发者无需对此感到担心。预构建库会为用户提供一些实现选项。

选择 API 级别和 NDK 版本

您的用户无法使用低于您的级别的 minSdkVersion。如果用户的应用需要在 API 21 上运行,您就无法针对 API 24 构建应用。您可以针对低于用户级别的 API 级别构建库。您可以针对 API 16 构建应用,并保持与 API 21 用户兼容。

各个 NDK 版本大部分是相互兼容的,但版本间的变更偶尔也会破坏兼容性。如果您确定您的所有用户使用的都是相同版本的 NDK,那么您最好也使用与用户相同的版本。否则,请使用最新版本。

使用 STL

如果您正在编写 C++ 和使用 STL,并且要分发共享库,那么您在 libc++_shared 和 libc++_static 之间的选择会对您的用户产生影响。如果您要分发共享库,则必须使用 libc++_shared,或确保共享库不会公开 libc++ 的符号。要实现此目标,最好的方法是通过版本脚本明确声明您的 ABI 界面(这也有助于将实现细节保持私有状态)。例如,一个简单的算术库可能拥有以下版本脚本:
注意:如果您要分发静态库,无论是选择静态 STL 还是共享 STL 都无关紧要,因为静态库中未关联任何内容。用户可以关联他们在应用中选择的任何内容。但用户必须关联一些内容,即使是针对仅限 C 的使用方。因此,请务必将这一点记录为必须采取的措施,并记录用于构建的 NDK 版本,以防 STL 版本之间存在不兼容的情况。


LIBMYMATH {
global:
    add;
    sub;
    mul;
    div;
    # C++ symbols in an extern block will be mangled automatically. See
    # https://stackoverflow.com/a/21845178/632035 for more examples.
    extern "C++" {
        "pow(int, int)";
    }
local:
    *;
};

首选方式应为版本脚本,因为这是控制符号可见性的最可靠方式。这对于所有共享库(无论是否是中间件)来说都是最佳做法,因为这可以防止您的实现细节被公开,并能够缩短加载时间。

另一个可靠性较低的方式是在关联时使用 -Wl,–exclude-libs,libc++_static.a -Wl,–exclude-libs,libc++abi.a。这种方式的可靠性较低是因为它只会隐藏库中明确指定的符号,并且不会为未使用的库报告诊断信息(库名称中的拼写错误不属于错误,并且用户应负责及时更新库列表)。此方式也不会隐藏您自己的实现细节。

在 AAR 中分发原生库

注意:本部分将介绍如何将 C/C++ API 分发给用户。如果原生库属于您的 Java API 的实现细节,请参阅包含 JNI 库的 Java 中间件部分。

Android Gradle 插件可以导入在 AAR 中分发的原生依赖项。如果您的用户使用的是 Android Gradle 插件,这将是他们使用您的库的最简单的方式。

原生库可以通过 AGP 打包到 AAR 中。如果您的库已经通过 externalNativeBuild 构建,这便是最简单的方法。

非 AGP build 可以使用 ndkports,或按照 Prefab 文档中的说明执行手动打包,以便创建 AAR 的 prefab/ 子目录。

包含 JNI 库的 Java 中间件

包含 JNI 库(即包含 jniLibs 的 AAR)的 Java 库需要小心谨慎地处理,这样它们包含的 JNI 库才不会与用户应用中的其他库发生冲突。例如,如果 AAR 包含的 libc++_shared.so 版本不同于应用使用的 libc++_shared.so 版本,那么只有其中一个版本会安装到 APK,并且这可能会引发不可靠的行为。
警告:错误 141758241:较旧版本的 Android Gradle 插件目前不会诊断这种错误。系统将任意选择一个同名库打包到 APK 中。

最可靠的解决方案是确保 Java 库中的 JNI 库不超过一个(这个建议也适用于应用)。包括 STL 在内的所有依赖项都应静态关联到实现库,并且应通过版本脚本强制执行 ABI 界面。例如,包含 JNI 库 libfooimpl.so 的 Java 库 com.example.foo 应使用以下版本脚本:

LIBFOOIMPL {
global:
    JNI_OnLoad;
local:
    *;
};

本示例按照 JNI 提示中所述的说明,在 JNI_OnLoad 中使用 registerNatives 来确保尽量少公开 ABI 界面,并最大限度缩短库的加载时间。文章来源地址https://www.toymoban.com/news/detail-732700.html

到了这里,关于Android NDK开发详解之针对中间件供应商的建议的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux中间件开发

    Linux中间件开发通常是指开发运行在Linux操作系统上的中间件软件,这些软件通常用于连接不同的应用程序或平台,提供服务的支持和协调。常见的Linux中间件包括Web服务器、应用服务器、消息队列、数据库中间件等。 中间件开发的主要任务是实现中间件的核心功能,例如We

    2024年02月12日
    浏览(43)
  • 【开发】中间件——ElasticSearch

    ElasticSearch是一个基于Lucene的搜索服务器。提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口 ElasticSearch是一个基于Lucene的搜索服务器。提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口 ElasticSearch是用JAVA开发的。达到实时搜索,稳定可靠,快速,

    2024年02月17日
    浏览(53)
  • 【消息中间件】详解mq消息积压

    作者简介 目录 1.产生原因 2.解决办法 2.1.事前处理机制 2.2.事中处理机制 2.3.事后处理机制 消息积压(Message Backlog)指的是在消息队列(MQ)系统中等待被处理的消息数量超过了正常的处理速度,导致消息在队列中积压堆积的情况。 消息积压的常见表现: 系统资源使用率上升

    2024年02月07日
    浏览(47)
  • Gin中间件的详解 ,用Jwt-go 和 Gin 的安全的登陆的中间件

    Gin 在不同的group 设置不同的中间件或者过滤器 Gin 的group下的路由上中间件或过滤器 用Jwt-go 和 Gin 的安全的登陆的中间件 JWT 类,它基本有所有基本功能,包括:GenerateToken,GenerateRefreshToken, ValidateToken, ParseToken 1. Gin 在不同的group 设置不同的中间件或者过滤器 Golang 中的 gin

    2024年02月15日
    浏览(61)
  • 开发实践6_缓存^中间件

    以下学习 朔宁夫 开发工程师 课程。 缓存可提高程序响应速度。数据库缓存(可过期)/ Redis缓存(Key:Value)/ Memcacheed缓存/ 程序层缓存。 一 缓存 1. 数据库缓存 创建缓存数据表 // python manage.py createcachetable cache_table setting // 创建新的演示 app //  python manage.py startapp cache_app setting注册

    2024年01月19日
    浏览(38)
  • Flask 中间件的原理及使用详解

    Flask 中间件是 Flask Web 应用的核心组件之一,它在处理 HTTP 请求和响应的生命周期中扮演着关键角色。利用中间件,开发者可以在不改变现有视图逻辑的前提下,为应用添加额外的处理逻辑,如身份验证、日志记录、请求预处理等。本文旨在提供一个全面的指南,讲解 Flask 中

    2024年02月04日
    浏览(36)
  • 消息中间件 —— ActiveMQ 使用及原理详解

    目录 一. 前言 二. JMS 规范 2.1. 基本概念 2.2. JMS 体系结构 三. ActiveMQ 使用 3.1. ActiveMQ Classic 和 ActiveMQ Artemis 3.2. Queue 模式(P2P) 3.3. Topic 模式(Pub/Sub) 3.4. 持久订阅 3.5. 消息传递的可靠性 3.5.1. 事务型会话与非事务型会话 3.5.2. 持久化与非持久化消息的存储策略 3.6. 消息发

    2024年02月03日
    浏览(42)
  • 使用开源中间件:云计算环境中的中间件采用开源框架,可以减少开发和部署时间,提高开发效率和可靠性。

    作者:禅与计算机程序设计艺术 云计算是一个新的分布式计算模型,具有独特的特征。它把资源的虚拟化、弹性伸缩和按需付费等能力集成到了一起。这种新型的分布式计算模式,使得软件工程师们在编写应用程序时无须担心服务器性能,而只需要关注应用本身。同时,云平

    2024年02月04日
    浏览(62)
  • 深入详解高性能消息队列中间件 RabbitMQ

      目录 1、引言 2、什么是 RabbitMQ ? 3、RabbitMQ 优势 4、RabbitMQ 整体架构剖析 4.1、发送消息流程 4.2、消费消息流程 5、RabbitMQ 应用 5.1、广播 5.2、RPC VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...) https://blog.csdn.net/chenlycly/article/details/124272585 C++软件异常排查从入

    2024年02月05日
    浏览(80)
  • 【云开发笔记NO.24】中间件和中台

    在云开发领域,中间件是一个至关重要的概念,它扮演着连接不同技术组件和应用程序的桥梁角色。中间件,顾名思义,是处于两个应用程序或系统之间的软件层,其主要负责屏蔽底层操作系统的复杂性,为上层应用程序提供一个统一、简化的接口。这种软件的存在大大减轻

    2024年04月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包