这里以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不兼容的一个方面。