AOSP的libc++.so和NDK的libc++_shared.so一样吗?

2024-03-22

我正在开发一款 Android 应用程序,其中有一个共享库(我在 Android Studio 中构建,我们称之为libA.so)由供应商动态加载另一个共享库提供程序(我们称之为libB.so)。我知道我不应该在我的应用程序中使用多个 C++ 运行时库(https://developer.android.com/ndk/guides/cpp-support.html#important_considerations https://developer.android.com/ndk/guides/cpp-support.html#important_considerations)所以我们决定在两个库中使用 c++_shared。

libB.so(供应商提供的)是在AOSP构建时编译和链接的(供应商坚持以这种方式构建库,对此无能为力)。生成文件为libB.so将 STL 标志设置为 c++_shared,如下所示:

LOCAL_NDK_STL_VARIANT := c++_shared

当我查看 NEEDED 标签时libB.so库,我可以看到对libc++.so

 0x0000000000000001 (NEEDED)             Shared library: [libdl.so]
 0x0000000000000001 (NEEDED)             Shared library: [libc++.so] <----
 0x0000000000000001 (NEEDED)             Shared library: [libc.so]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so]
 0x000000000000000e (SONAME)             Library soname: [libB.so]

当我跑步时readelf -d libc++.so检查 AOSP 的 libc++ 的内容。所以我得到了这个

Dynamic section at offset 0xe4b40 contains 29 entries:
  Tag        Type                         Name/Value
 0x0000000000000003 (PLTGOT)             0xe6310
 0x0000000000000002 (PLTRELSZ)           22128 (bytes)
 0x0000000000000017 (JMPREL)             0x39ff8
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000007 (RELA)               0x2ce58
 0x0000000000000008 (RELASZ)             53664 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffff9 (RELACOUNT)          380
 0x0000000000000006 (SYMTAB)             0x238
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000005 (STRTAB)             0xdeb8
 0x000000000000000a (STRSZ)              102917 (bytes)
 0x000000006ffffef5 (GNU_HASH)           0x270c0
 0x0000000000000001 (NEEDED)             Shared library: [libdl.so]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so]
 0x000000000000000e (SONAME)             Library soname: [libc++.so]
 0x000000000000001a (FINI_ARRAY)         0xe08e0
 0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
 0x0000000000000019 (INIT_ARRAY)         0xe5b38
 0x000000000000001b (INIT_ARRAYSZ)       8 (bytes)
 0x000000000000001e (FLAGS)              BIND_NOW
 0x000000006ffffffb (FLAGS_1)            Flags: NOW
 0x000000006ffffff0 (VERSYM)             0x2bb7c
 0x000000006ffffffc (VERDEF)             0x2cddc
 0x000000006ffffffd (VERDEFNUM)          1
 0x000000006ffffffe (VERNEED)            0x2cdf8
 0x000000006fffffff (VERNEEDNUM)         2
 0x0000000000000000 (NULL)               0x0

我知道 NDK 还提供libc++.so,但是当我在 Android NDK 中分发的库中运行相同的命令时,出现错误

readelf: Error: libc++.so: Failed to read file header

如果我没记错的话,那是因为在 NDK 中,libc++.so实际上是一个链接描述文件。

libA.so(我用我的应用程序构建并加载的那个libB.so)最终依赖于libc++_shared.so

Dynamic section at offset 0x4bca50 contains 28 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libdl.so]
 0x0000000000000001 (NEEDED)             Shared library: [liblog.so]
 0x0000000000000001 (NEEDED)             Shared library: [libc++_shared.so] <---
 0x0000000000000001 (NEEDED)             Shared library: [libc.so]
 0x000000000000000e (SONAME)             Library soname: [libA.so]

我认为我不能(或应该)将两者捆绑在一起libc++.so and libc++_shared.so在我的应用程序中。

那么,AOSP 是libc++.so与 NDK 相同libc++_shared.so?

有人知道为什么 AOSP 添加动态依赖libc++.so代替libc++_shared.so即使当LOCAL_NDK_STL_VARIANT := c++_shared用来?我应该要求我的提供商链接到libc++_shared.so反而?也许有人有更好的建议来修复这种依赖性不匹配。


不,它们并不等同。 AOSP 中的 libc++.so 是针对最新版本构建的(从技术上讲,它是futureAPI 级别)API 级别并且没有 libandroid_support。它是使用一组不同的标志构建的,并且可能是不同的 ABI。它是用一组架构标志构建的,允许编译器使用并非在所有 Android 设备上都可用的指令。它也是与 NDK 中的版本不同的修订版,但对于不同的 NDK 版本也是如此,并且在决定它们是否兼容方面不太重要。

如果供应商向您提供 libB.so 以包含在您的应用程序中,则他们的构建方式不正确。正如您所注意到的,它链接到平台 libc++.so,应用程序无法访问该平台。您这边没有解决办法;供应商需要提供合适的 NDK 库。如果他们想继续使用 AOSP 构建系统,他们需要设置LOCAL_SDK_VERSION so LOCAL_NDK_STL_VARIANT没有被忽略。

如果供应商提供的设备已将此库安装到系统映像(即 /system/lib64/libB.so,not包含在您的申请中),那么@alex-cohn 的答案中的指导适用。这就是 libandroid.so 等官方 NDK 库的构建方式。它们链接到系统的 libc++.so,但仅向应用程序公开 C ABI。只要供应商遵循这些准则,就可以了。

正如亚历克斯提到的,您引用的文件比实际情况稍微具有限制性。它is可以在同一个程序中使用多个 STL(否则 NDK 应用程序根本无法工作,因为平台和应用程序使用不同的 STL),但它确实需要非常仔细地管理 ABI 的表面积和大量的谨慎避免 ODR 违规。

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

AOSP的libc++.so和NDK的libc++_shared.so一样吗? 的相关文章

  • Android Room ORM:支持 SQLite 的自定义构建

    我需要使用 SQLite 的自定义构建 基于 sqlite org 版本https sqlite org android doc trunk www index wiki https sqlite org android doc trunk
  • 使用 ActiveAndroid 库存储 HashMap

    我有一堂课 Table name Control public class Control extends Model Column private String name Column private Map
  • 使用holoeverywhere滑块插件时如何从活动中获取当前可见的片段?

    我想知道如何执行这些操作无处不在的全息 https github com Prototik HoloEverywhere 将滑块插件与 tabber 结合使用时 从活动中获取对当前可见和活动片段的引用 从活动 其他片段获取对 TabsTab
  • 制作一个包含自定义对象列表的可分割类

    我在使列表对象可解析时遇到错误 我认为读取对象时发生错误 这是我的代码 public class TestSample implements Parcelable int intValue String stirngValue privat
  • 如何通过 JNI 将本机枚举公开给 Java?

    我正在从现有项目导入标头以将端口移植到 Android NDK 在某些情况下 我想在 Java 层使用本机标头中定义的枚举 怎样才能做到这一点呢 理想情况下 我想以某种方式将常量公开给 Java 层 但我没有找到这样做的方法 最明显的可能性
  • Android 从 C++ 端播放原始音频

    我需要能够在 Android 系统的 C 端以自定义文件格式传输音频 我正在致力于移植自定义媒体播放器 并且需要能够打开自定义文件并从中传输音频 这很重要 因为我认为从性能角度来看将整个播放器移植到 JAVA 是不可行的 并且通过 JNI
  • 使用 setText 更改文本后如何更新屏幕?

    现在我正在使用以下代码来更新TextView txtMain setText new text 该代码执行后 屏幕不会更新新文本 有没有办法可以强制文本立即更新 该代码执行后 屏幕不会更新新文本 一旦您将控制权归还给 Android 就应该
  • 多种语言的多种字体

    我最近在开发应用程序时遇到了一种情况 我必须在文本视图中显示不同的语言 目前我正在展示一些使用字体 字体像这样 Typeface tf Typeface createFromAsset this getAssets DroidHindi t
  • 如何使用数据绑定将点击侦听器设置为 LinearLayout

    我目前正在尝试将点击侦听器设置为LinearLayout查看在 xml使用数据绑定的布局文件 我已经设法让它在其他视图上很好地工作 比如Button or TextView 但由于某种原因 它不能与LinearLayout 这是我尝试的基本
  • Android中如何使用JNI获取设备ID?

    我想从 c 获取 IMEIJNI 我使用下面的代码 但是遇到了未能获取的错误cls 它总是返回NULL 我检查了环境和上下文 它们都没有问题 为什么我不能得到Context班级 我在网上搜索了一下 有人说我们应该使用java lang Ob
  • Android 辅助功能服务检测通知

    我试图让我的应用程序在显示通知时进行检测 我已在设置应用程序中启用它并且onServiceConnected确实接到电话 但是当我创建通知或通过 gmail 应用程序接收电子邮件时 什么也没有发生 onAccessibilityEvent没
  • TextView 宽度匹配drawableTop 宽度

    有什么办法可以使TextView width匹配复合可绘制宽度 XML 例如对于 xml 代码
  • Android Gradle 问题 - Flutter / Dart

    我的 Gradle 同步有问题 我使用 IntelliJ 和 Android Studio 构建 Flutter Dart 应用程序 我添加了 2 个新的依赖项 现在 Gradle 出现了问题 在 Android Studio 中一切正常
  • 将非 Android 项目添加到 Android 项目

    我在 Eclipse 中有三个项目 Base Server 和 AndroidClient Base和Server是Java 1 7项目 而AndroidClient显然是一个android项目 基础项目具有在服务器和 Android 客户
  • Jetpack Compose 中复选框中的透明复选标记

    在我的 Compose 应用程序中 我需要创建一个圆形复选框 我已经通过下面的代码实现了这一点 Composable fun CircleCheckBox isChecked Boolean modifier Modifier Modifi
  • Android:如何创建模态进度“轮”叠加层?

    我想在我的视图上显示模式进度 轮子 叠加层 ProgressDialog 很接近 但我不想要对话框背景或边框 我尝试设置对话框窗口的背景可绘制 this progressDialog new ProgressDialog Main this
  • Android SHA1 发布密钥库无法与 Google 地图配合使用

    我正在使用 Google Maps Android API 但遇到了一些问题 我正在使用 android studio 签署我的 apk 在 android keystore jks 创建一个 另外 我选择 发布 作为其中的类型 我已经使用
  • 为什么 Google 建议将库复制到您的树中?

    谷歌的Play 服务 API 的使用说明 http developer android com google play services setup html 例如 说 将 extras google google play service
  • React Native HTTPS Api 调用在 IOS 中有效,但在 Android 中无效

    所以基本上我所做的就是简单地对启用了 HTTPS 的 UAT 服务器进行简单的 Axios 调用 我已经在 IOS 中测试了整个应用程序 API 调用工作正常 但一旦我在 Android 中测试了相同的应用程序 在真正的 Android 设
  • Keystore getEntry 在 Android 9 上返回 NULL

    c我已对存储在 Android 密钥库中的登录密码进行了加密和解密 在 Android 9 上 我观察到应用程序在尝试解密密码时崩溃 我无法重现它 但拥有 Pixel 3 的用户是崩溃的设备之一 下面是我如何从密钥库解密密码 private

随机推荐

  • Pimpl 习语的实践

    SO 上有一些关于粉刺成语 但我更好奇它在实践中被利用的频率是多少 我知道性能和封装之间存在一些权衡 再加上额外的重定向带来的一些调试烦恼 那么 这是应该在每个班级中采用 还是全有或全无的基础上采用 这是最佳实践还是个人偏好 我意识到这有点
  • 从一个 data.frame 中选择第二个 data.frame 中不存在的行

    我有两个数据框 a1 lt data frame a 1 5 b letters 1 5 a2 lt data frame a 1 3 b letters 1 3 我想找到 a1 有而 a2 没有的行 是否有针对此类操作的内置函数 注 我确
  • .Net 和插件架构

    继 Jeff 和 Joel 对插件架构的讨论之后 C 中的插件 使用运行时加载的 dll 总是有点麻烦 您必须做大量的基础工作才能启用它们 然后插件也必须用 C 编写 甚至通常使用相同的编译器 COM 对象和 ActiveX 解决了其中一些
  • |数据目录|返回 AppData 文件夹的错误路径

    DataDirectory 您只有一份工作 DataDirectory 在 IIS7 5 上解析为 C inetpub wwwroot appname App Data 该文件夹不存在 正确的文件夹是 C inetpub wwwroot a
  • 解析 android:drawable 的 XML 时出错

    你好 我面临一个问题 我希望我的应用程序从框架中获取资源 这是我的 xml 代码片段 为此 在 attrs xml 中进行了以下更改 和框架级别的 theme xml android drawable btn minus ss 可绘制btn
  • 将 C++ 项目移植到 Android

    我有一个在 Windows 上开发的大型 C 应用程序 我需要将其移植到 Android 才能将其作为 Galaxy Tab 应用程序运行 我读了很多关于 NDK 的教程 但将 C 文件嵌入到 Android 中似乎很困难 我可以使用NDK
  • AccessController checkPermission 总是抛出异常

    如何检查应用程序是否有权读取或写入文件系统上的特定目录 我正在尝试这个 try AccessController checkPermission new FilePermission files i getAbsolutePath read
  • “virtualenv”不被识别为内部或外部命令、可操作程序或批处理文件

    安装Python和Djangom后 我尝试使用virtualenv使用 virtualenv 来实现 django 项目目的 我使用 pip 安装了 virtualenv pip install virtualenv got install
  • 使用新的 Net Core 3.0 Json 忽略 null 属性

    在 ASP Net Core 2 2 中使用 JSON Net 时 当序列化为 JSON 时 我能够忽略值为 null 的属性 JsonProperty NullValueHandling NullValueHandling Ignore
  • 将 .NET Core 重新定位到 net471、net 472

    我的 Netcore 2 0项目可以定位net471 但是当我升级到 NET 2 1时 我无法重新定位net471 or net472 我可以在最新版本的 the NET core 中重定向吗 Severity Code Descripti
  • letrec、命名let和内部定义的常见用法?

    我有几本关于Scheme的书 其中一些提到了名为let和letrec的书 但没有一本真正给出了令人信服的例子 我的意思是 我何时以及为何使用其中一个而不是另一个 是否存在 letrec named let 确实是比内部定义甚至外部辅助过程更
  • 如何在一个文件中使用java中的多个类?

    我想知道如何在java中的一个文件中使用多个类 我输入了这段代码 但它显示编译错误 class test int a b c void getdata int x int y a x b y void add c a b System ou
  • 基于WordNet测量语义相似度,Brown Corpus有什么用

    我遇到了几种使用 WordNet 的结构和层次结构来测量语义相似性的方法 例如Jiang and Conrath测度 JNC Resnik测度 RES 林测度 LIN 等 使用 NLTK 测量它们的方式是 sim2 wn jcn simil
  • 通过Android USB主机与智能卡读卡器通信

    我正在尝试向智能卡发送命令 我用一个金雅拓 IDBridge CT30 PC TWIN 读卡器 http www smartcardfocus com images content GEMTR jpg and a ID桥K30 http c
  • 动态创建的 href 点击事件在 Firefox 或 Safari 中不起作用?

    我正在使用 javascript 动态创建 ahref 标签来下载使用 javascript 代码生成的 csv 文件 以下代码在 chrome 中运行良好 但在 safari 或 firefox 中不起作用 var a document
  • Blazor [WASM] System.TypeLoadException:无法解析带有令牌 0100001a 的类型

    我收到此错误 enter code hereSystem TypeLoadException 无法从 typeref 解析带有标记 0100001a 的类型 程序集 System Runtime Version 4 2 2 0 Cultur
  • 更新 javascript 表:未捕获类型错误:对象 [object Object] 没有方法 'tableRow'

    我正在制作一个联系人应用程序 它使用用户输入更新表格 但一旦输入数据 似乎无法更新表格 我只收到上面的错误 不知道如何改变方法 我尝试了很多不同的功能等 但没有运气 var nameField addressField emailField
  • MS Teams 客户端上内部托管的图像无法访问

    我们已经在我们的企业团队中启用了 Bot Framework 应用程序 并且我们想要使用AdaptiveCards向用户呈现丰富的内容 例如 我们正在发送AdaptiveImage包含指向企业形象店的url 示例代码 new Adaptiv
  • PHP 全局目录 UTF-8

    我正在尝试获取变量路径中的所有文件 atm 我正在使用 glob 但我只是找不到打开其中包含 的路径的方法 我尝试了很多解码 编码 但似乎都不起作用 当我更改文件名和变量中的 时 我得到了正确的答案 所以它必须是 utf8 字符 我猜 PH
  • AOSP的libc++.so和NDK的libc++_shared.so一样吗?

    我正在开发一款 Android 应用程序 其中有一个共享库 我在 Android Studio 中构建 我们称之为libA so 由供应商动态加载另一个共享库提供程序 我们称之为libB so 我知道我不应该在我的应用程序中使用多个 C 运