场景
当我们将android系统编译出来的so库集成到APP的native代码中会遇到一个问题libc++.so not find
分析
1、libc++.so android系统没有对外公开也就是public.txt没有包含
2、APP使用NDK使用的不是libc++
先看配置方法
1、ndk 编译在build.gradle里面配置由宏控ANDROID_STL配置
externalNativeBuild {
cmake {
abiFilters “armeabi-v7a”,“arm64-v8a”
arguments ‘-DANDROID_TOOLCHAIN=clang’, ‘-DANDROID_STL=c++_static’
}
}
或者’-DANDROID_STL=c++_shared’
编译出来的so叫libc++_shared.so
在android系统中通过LOCAL_NDK_STL_VARIANT := c++_static 指定
LOCAL_NDK_STL_VARIANT := c++_shared 指定
编译链接的库叫libc++.so
android系统在public.txt对外暴漏的so叫libstdc++.so
//两者是不同的so,不能兼容
libc++.so与libc++_shared.so有什么区别
主要区别
打包方式:
libc++.so 是系统提供的 C++ 标准库,通常存在于 Android 系统的 /system/lib 目录中。
libc++_shared.so 是由开发者项目自带的 C++ 标准库实现,通常在应用的 lib 目录中。
使用场景:
libc++.so 通常用于系统库或大型应用,其版本与系统版本紧密绑定。
libc++_shared.so 用于应用程序和库的内部,确保在应用中使用一致的 C++ 标准库实现。
依赖管理:
libc++.so 的版本可能随系统更新而改变,依赖于系统的更新和维护。
libc++_shared.so 由应用或库自带,确保库和应用之间的一致性,避免由于系统更新而导致的兼容性问题。
参考文档说明
https://libcxx.llvm.org/