安卓多仓c++运行时统一规范化

多仓libc++_shared.so版本规范化

c++运行时简介

被墙的原因,先贴一下google的介绍

C++ 运行时库

表 1. NDK C++ 运行时和功能。

名称功能
libc++现代 C++ 支持。
systemnewdelete。(在 r18 中已弃用。)
none无头文件,有限 C++。

libc++

LLVM 的 libc++ 是 C++ 标准库,自 Lollipop 以来 Android 操作系统便一直使用该库,并且从 NDK r18 开始成为 NDK 中唯一可用的 STL。

注意:如需全面详细了解任何给定版本对 C++ 库的支持级别是否达到了预期,请参阅 C++14 StatusC++17 StatusC++2a Status 页面。 请注意,编译器的 C++ 语言支持级别互不相关;请改为参阅 Clang 中的 C++ 支持

libc++ 的共享库为 libc++_shared.so,静态库为 libc++_static.a

注意:libc++ 不是系统库。如果使用 libc++_shared.so,必须将其包含在 APK 中。如果使用 Gradle 构建应用,此步骤会自动完成。

libc++ 依据伊利诺伊大学“BSD 式”许可和 MIT 许可双重授权。如需了解详情,请参阅许可文件

system

system 运行时指的是 /system/lib/libstdc++.so。请勿将该库与 GNU 的全功能 libstdc++ 混淆。在 Android 系统中,libstdc++ 只是 newdelete。对于全功能 C++ 标准库,请使用 libc++。

注意:系统 STL 将在未来 NDK 版本中移除。请参阅问题 744

系统 C++ 运行时支持基础 C++ 运行时 ABI。从根本上来说,此库就是提供 newdelete。不同于 NDK 中提供的其他选项,此库不支持异常处理和 RTTI。

<cstdio> 等用于 C 库头文件的 C++ 封装容器之外,并无标准库支持。如需 STL,您应使用本页面提供的其他选项。

none

另外,您还可选择不使用 STL。在这种情况下,没有关联或授权要求。不提供 C++ 标准头文件。

选择 C++ 运行时

CMake

CMake 的默认值为 c++_static

您可以使用模块级 build.gradle 文件中的 ANDROID_STL 变量指定 c++_sharedc++staticnonesystem。如需了解详情,请参阅有关 CMake 中 ANDROID_STL 的文档。

ndk-build

ndk-build 的默认值为 none

您可以使用 Application.mk 文件中的 APP_STL 变量指定 c++_sharedc++staticnonesystem。例如:

APP_STL := c++_shared

ndk-build 仅允许为您的应用选择一个运行时,并且只能在 Application.mk 中进行选择。

关键的地方来了

每个应用一个 STL

过去,NDK 除了支持 libc++,还支持 GNU libstdc++ 和 STLport。如果应用依赖于预构建库,而构建相应库所使用的 NDK 与构建应用使用的 NDK 不同,需确保其兼容性。

一个应用不得使用多个 C++ 运行时。不同的 STL 互兼容。举例来说,libc++ 中 std::string 的布局不同于 gnustl。根据某种 STL 编写的代码无法使用以另一种 STL 编写的对象。以上仅举一例,其他不兼容情况不胜枚举。

一个应用不得使用多个c++运行时,所以说,如果app是多仓依赖的情况下,如果多个依赖库使用了不同的c++运行时,一般会导致app运行时崩溃或者出现各种奇葩的问题。app统一stl规范不得不为之。

如何统一STL呢?

1.尽量使用官方推荐的做法,使用c++_shared

2.保证c++shared运行时版本,在module级别的build.gradle中添加ndkVersion约束

ndkVersion "21.0.6113669"

3.发布aar时,排除c++_shared.so库

    packagingOptions {
        exclude '**/libc++_shared.so'
    }

4.专门发布一个aar,该aar中包含libc++_shared.so,供app工程依赖,保证c++_shared.so打包至apk中

比如一个简单的demo-aar(https://github.com/whulzz1993/cppshared)

5.在工程build.gradle中添加相应版本的so库

packagingOptions {
			pickFirst 'lib/*/libc++_shared.so'
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值