这里以ndk-r14b举例,每个版本可能都有差异:
- ndk-r14b
- build
- lib
- build_support.py:各种arch cpu怎么配对
- ndk-build: 命令的源头
- ndk-build(linux) / ndk-build.cmd(windows):转向build/ndk-build
- toolchains:各个平台编译工具链
- llvm:LLVM是一套编译器基础设施项目,为自由软件,以C++写成,包含一系列模块化的编译器组件和工具链,用来开发编译器前端和后端。
- platforms
- android-9:支持的api level
- arch-arm:不同的cpu架构
- usr
- include
- xx.h: so库的头文件
- lib
- xxx.so:各种打包好的so库
- arch-mips
- arch-x86
- android-11
toolchains
triples
architecture
EABI:Embedded Application Binary Interface(嵌入式应用程序二进制接口)
ABI:Application Binray interface
- API:库的使用者可能需要去遵循这个接口规范,
Add
函数的参数个数以及参数类型等等。
- ABI:
main
使用到了Add
这个API
,这个API
包含再一个myso
动态库里面,现在设计到一个符号寻找机制,即编译器需要去myso
动态库里面寻找Add
这个符号,那符号的命名规则不一致会导致什么结果?如gcc1.0
版本的符号命名规则是再函数前面加一个_
,即最后Add
符号名称_Add
,gcc2.0
版本的符号命名规则是再函数后面加一个_
, 即最后Add符号名称Add_
。思考一个问题,myso
是利用gcc1.0
版本编译,main
使用gcc2.0
版本编译,会出现是什么问题? 编译器会提示你Add_
符号未定义,这里说的符号导出规则也就是属于ABI
兼容问题。
结论 :影响你API
不兼容的可能是你使用的API
新增了参数。影响ABI
不兼容的可能仅仅就是编译器版本不同,一个是源码层面,一个是编译器层面(或者说二进制层面,即编译器生成的二进制), 当然编译器仅仅只是导致ABI不兼容的一个方面。