Android NDK 和更新的 API 支持

2023-12-14

我正在开发一个大量使用 NDK 的 Android 应用程序。在 Java 方面,我们的目标是 SDK 19,最小 SDK 为 16。有没有办法在 NDK 方面做类似的事情?

现在我们的Application.mk文件有APP_PLATFORM := android-16。有没有办法以平台 19 为目标,但在 NDK 端仍然兼容回 16?


这是可行的,但并不容易。

对于 java 代码,如您所知,您可以设置任何更高的目标 SDK 版本并使用此类功能,只要您确保这些代码路径仅在较新的设备上执行 - 简单。

对于本机代码,原则上可以设置更高APP_PLATFORM比你的基线,并尝试做同样的事情,但你需要跟踪一些细节:

  • 您不能无条件链接到新平台的函数,您需要动态加载它们。也就是说,不是直接调用函数并将库添加到LOCAL_LDLIBS,您需要通过加载函数dlopen and dlsym相反,以确保二进制文件可以在旧版本上加载。 (或者,您可以构建单独的共享库,其中一个共享库可以在所有平台上加载,而另一个共享库只能在较新的平台上加载。)

  • 一些仿生libc函数发生了变化(主要是android-21,但在此之前也发生了一些较小的变化) - 之前确实存在但已更改符号名称的函数。已更改的最常见功能之一是rand- 之前android-21, rand是一个实际调用的内联函数lrand48(),所以你的二进制文件最终取决于lrand48存在于旧的 Android 版本中'libc.so,虽然他们没有任何rand那里。在android-21,添加了很多这样的函数,并且删除了内联函数,所以如果您使用APP_PLATFORM := android-21,你的二进制文件最终将取决于函数rand以前不存在。看https://stackoverflow.com/a/27093163/3115956 and https://stackoverflow.com/a/27338365/3115956有关此的更多详细信息。

  • 请记住,您不需要设置APP_PLATFORM与java端的目标SDK相同,如果您想在较新的固件版本上选择性地使用较新的功能,您(可能)只需要设置它。

由于第二个问题,您可能不想设置更高的值APP_PLATFORM根本不。如果你使用dlopen(所以你实际上并不需要.so文件来链接),您可以通过将这些新标头从较新的平台版本复制到您自己的项目中并使用较旧的项目进行构建来非常轻松地进行管理APP_PLATFORM.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android NDK 和更新的 API 支持 的相关文章

  • 如何自定义 Firebase 身份验证 ui

    我正在使用 Firebase Auth Ui 进行号码验证 我有一些要求 需要更改国家旋转器下拉项目的文本和背景颜色 我正在使用下面的样式 但它不会改变下拉菜单的背景颜色或项目的文本颜色 style name FirebaseUI Coun
  • Android:java.lang.OutOfMemoryError:

    我在 Android 上开发了一个使用大量图像的应用程序 可绘制文件夹中有很多图像 比如说超过 100 张 我正在开发图像动画应用程序 我使用 imageview 来显示 GIF 图像 我使用了将 gif 图像分割成多个 PNG 格式图像的
  • 处理 SavedInstances 并恢复活动

    基本上我的应用程序有 2 个活动 说 A 和 B A 启动 B Activity B 播放音乐并且还有通知 情况 1 当视图仍在活动 B 上时 我按主页按钮 然后单击通知 活动 B 将打开 其视图完好无损并播放音乐 因为在清单中我使用 an
  • 单击另一个项目/小部件时展开/打开微调器?

    当用户单击另一个按钮时 我试图展开微调器 例如 我有一个带有值的微调器和一个 确定 按钮 当用户单击 确定 按钮而不从微调器中选择任何值时 微调器会自行扩展 是否可以在无需用户与微调器交互的情况下获得扩展微调器的事件 只需致电Spinner
  • 如何在 Android 中的 Chrome 或 Firefox 等特定浏览器的 Web 视图中加载应用程序

    我是 Android 新手 我正在做一个应用程序 我需要在平板电脑上的 Web 视图中加载现有的应用程序 在平板电脑中 当我使用 Web 视图加载应用程序时 我的应用程序将加载到默认浏览器中 如何在平板电脑上的 Web 视图中的特定浏览器
  • Android:将图像裁剪为特定尺寸

    我的目的是让用户从图库中选择一张图像 然后进行裁剪活动 但是 我需要将定义裁剪蒙版的矩形锁定到某个尺寸 然后用户只需重新定位它即可显示图像的一部分 关于如何做到这一点有什么想法吗 Thanks T Intent intent new Int
  • 如果未安装应用程序,深层链接将重定向到 Play 商店

    我在我的应用程序中使用深度链接的概念 我真正想要的是 当我共享我的应用程序中的链接时 它工作正常 它会转到我想在我的应用程序中打开的活动 但问题是当用户没有这个时应用程序此链接通过手机浏览器打开 显示错误 未找到 但如果未安装应用程序 我想
  • 如何去掉android状态栏的电池图标?

    我通过去掉背景图像来删除 Android 中显示网络 电池和时间信息的状态栏 但图标仍然存在 我也想知道如何删除电池图标 不是用于应用程序 而是用于框架开发 提前致谢 你试过打电话吗 getWindow setFlags WindowMan
  • 作为 ViewPager 的一部分更新 ListFragment 中的数据

    我在 Android 中使用 v4 兼容性 ViewPager 我的 FragmentActivity 有一堆数据 这些数据将以不同的方式显示在我的 ViewPager 的不同页面上 到目前为止 我只有同一个 ListFragment 的
  • Firebase 身份验证中是否需要 SMS Retriever API 才能进行 otp 自动填充?

    我在用Firebase auth api验证用户电话号码 目前 就我而言 我有一个屏幕 用户在其中输入电话号码 并在第二个屏幕上输入密码 根据文档firebase大多数时候自动检索 OTP 并启动验证过程 所以我的问题是它已经实现了SMS
  • RxJava android mvp 单元测试 NullPointerException

    我是 mvp 单元测试的新手 我想对演示者进行一个非常基本的测试 它负责登录 我只想断言 view onLoginSuccess 这是演示者代码 public LoginPresenter LoginViewContract loginVi
  • 当类明显存在时,我收到 java.lang.NoClassDefFoundError

    当我尝试在运行时使用该库时 出现以下错误 java lang NoClassDefFoundError com google api client extensions android2 AndroidHttp 我已经将此库添加到我的项目中
  • 如何将AVFrame转换为glTexImage2D使用的纹理?

    如您所知 AVFrame 有 2 个属性 pFrame gt data pFrame gt linesize 当我从视频 sdcard test mp4 android平台 读取帧后 并将其转换为RGB AVFrame副 img conve
  • Proguard 正在破坏我的清洁度。 Gson 和泛型

    我有一个从持久性加载信息的函数 我只是以一种非常简单的方式告诉它的类型 该类称为SharedPreferencesHelper kt所以它是一个真正的生活问题解决者 fun
  • 以编程方式创建 FloatingActionButton(无需 xml)

    我很欣赏 Android 的 FloatingActionButton fab 功能 并希望在我的项目中的许多不同地方使用它们 现在 我有这样的东西 我有几个 xml 规范 除了 id 图标和 onclick 之外 所有这些规范都是相同的
  • 解析 XML 标签不匹配时出错

  • 无法使用 Zxing Android 扫描 Code 128

    我已将 ZXing 条码阅读器集成到我的 Android 应用程序中 它可以扫描大部分代码 但我有一张电费单 它无法扫描 使用 Galaxy Ace 5 0MP 我认为问题是由于相机分辨率和焦点造成的 因为当我使用 Xperia SL 12
  • 具有隐式授权的 OAuth 应用程序中的客户端模拟

    来自 OAuth 草案 隐式section https datatracker ietf org doc html draft ietf oauth v2 31 section 1 3 2 在隐式授权流程期间发出访问令牌时 授权服务器不对客
  • PhoneGap Build Android 不显示闪屏

    这是我的 config xml 中与启动屏幕相关的代码
  • 使用部分字符串匹配进行 Firebase 查询[重复]

    这个问题在这里已经有答案了 假设我有一个简单的 firebase 实时数据库结构 其中关键是username其值为userid 现在我想搜索userid by username 如果用户名匹配 这很容易 但如何获得部分匹配的答案 更清楚地说

随机推荐

  • 套接字线程和 PyGTK

    我正在尝试编写一个即时消息程序 基本的用户界面即将完成 我正在研究消息的接收部分 我有一个 UI 类和一个线程 Receive Socket 类 每次 Received Socket 类的套接字接收到消息时 它都会执行 gobject id
  • C++ 递归类型定义是否可行,特别是我可以在 T 的定义中放置一个向量 吗?

    对于我的一个项目 我真正想做的是这个 将其简化到最低限度 struct Move int src int dst struct MoveTree Move move std vector
  • 获取YAML路径下的所有节点

    我有一个如下所示的 YAML 文件 Main topofhouse x 276 4375 y 71 0 z 60 5 yaw 290 7768 pitch 35 400017 2ndfloor x 276 5 y 67 0 z 60 5 y
  • typescript:错误 TS2693:“Promise”仅指类型,但在此处用作值

    我正在尝试对我的 AWS Lambda 使用 Typescript 但在使用 Promise 的地方都会收到以下错误 error TS2693 Promise only refers to a type but is being used
  • 从非 UI 线程更新 ObservableCollection

    我正在开发 Windows 8 应用商店应用程序 我有一个计时器 每两分钟调用一次委托并发出异步网络请求 生成的数据将添加到绑定到 UI 元素的 observablecollection 中 这样做会引发异常 因为正在非 UI 线程上修改
  • Flexbox、CSSGrid 的奇怪行为

    我有这样的情况 https jsfiddle net johnsam rdtva2fq On Chrome效果很好 请看这个 它开始 参见 FIRST 和 LAST btn 好的 On Safari它没有 对于 iPad iPhone 也是
  • 如何检查 Java 8 Stream 是否为空?

    我如何检查是否Stream为空 如果不是 作为非终端操作抛出异常 基本上 我正在寻找与下面的代码等效的内容 但没有具体化中间的流 特别是 在终端操作实际消耗流之前不应进行检查 public Stream
  • 将特定的类/ID 应用到菜单上的当前页面 (PHP)

    我有一个这样的菜单 div a href http domain com folder biography img src blahblahblahblah a a href http domain com folder contacts
  • 向 QML 项目添加资源会导致编译速度非常慢

    我在项目的资源文件中添加了一些图标 突然间 QML 代码的每一个微小更改都会导致项目运行前需要 7 8 秒的等待时间 几乎感觉像是在重新编译 C 代码 但实际上这是 qrc 文件 编译 造成的延迟 我尝试禁用 qrc 压缩 希望它会变得更快
  • 为什么我的图像没有被附加到数组中?

    我有一个简单的模型 其中包括 var photos UIImage 我已将 zombies jpg 文件作为文件复制到项目中 然后 在表视图控制器中所需的 init 中 我想加载一条虚拟记录 我可以定义所有 String 和 NSDate
  • 多处理池和生成器

    首先看下面的代码 pool multiprocessing Pool processes N batch for item in generator batch append item if len batch 10 pool apply
  • 用于 SEO 的“h1”中的“p”标签[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 会使用 p 嵌套在 a 中的标签 p h1 标签对 SEO 不利吗 h1 p Some title p p Some subtitle p h1 这将使我的生活变得更轻松 处理动态页
  • 如何在 React Native 中运行后台任务?

    我已经建立了一个iOS 小应用程序在 React Native 中进行位置跟踪 定期将纬度 经度发送到用户选择的服务器 然而 这仅在应用程序位于前台时才有效 当用户在其他应用程序中时 如何在后台运行此任务 不幸的是 目前不支持任何类型的后台
  • 日期与日期时间

    我正在开发一个需要返回事件日期的程序 我正在寻找一个Date not a DateTime 是否有一种只返回日期的数据类型 不 没有 DateTime表示由日期和时间组成的某个时间点 但是 您可以通过以下方式检索日期部分Date财产 这是另
  • 如何将多种类型的用户重定向到各自的 Activity?

    我正在 Firebase 上创建一个投票应用程序 我有 3 种类型的用户 到目前为止 我可以在两种用户 学生 教师 使用以下代码登录后成功将他们重定向到各自的活动 到目前为止我的用户但现在我必须添加另一个用户 ADMIN 并且像其他用户一样
  • NHibernate 加载实体以及子集合的一部分

    有没有办法通过子集合上的子句来加载 NHibernate 实体 我有一个场景 我在 操作 中记录更改 即一个操作可以包含对多个实体的更改 当我想要加载特定实体的日志时 我会加载对该实体所做的任何更改的所有操作 加载这些操作会导致加载所有更改
  • Scala 这种别名和自我类型

    之间有什么关系吗this aliasing and self type Is this aliasing的一个特例self type 在scala 2nd P776编程中 作者说 抽象类 Parser T 扩展 p gt 你在第 29 4
  • PHP 闭包对象是否符合垃圾回收条件

    我想知道是否有人知道 PHP 的匿名函数是否符合垃圾回收条件 我知道用创建的函数create function没有被垃圾收集 但我找不到任何关于使用创建的内容的参考function 语法 内部表示为 Closure 对象 PHP 垃圾收集器
  • Android Studio:使用 Mac (OSX) 和 Windows 的同一项目的 SDK 位置发生变化

    我正在开发一个 Android Studio 项目 我的团队成员使用 Windows 我使用 OSX 问题是 当我从 git 提取新代码然后打开项目时 我会根据 Mac 的 SDK 位置得到各种更改 First a notice when
  • Android NDK 和更新的 API 支持

    我正在开发一个大量使用 NDK 的 Android 应用程序 在 Java 方面 我们的目标是 SDK 19 最小 SDK 为 16 有没有办法在 NDK 方面做类似的事情 现在我们的Application mk文件有APP PLATFOR