[✔️]ndk目录深入分析

106 阅读2分钟

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