Android 交叉编译

https://www.jianshu.com/p/b31acea79717

https://www.jianshu.com/p/f77554b0caef

概念

  • 编译环境和运行环境不同(在一个平台(pc)生成另一个平台(Android ios等)的可执行代码)

使用到的工具

CC编译器

  • 对C源文件进行编译处理,生成汇编文件( C Compiler)

  • ls -l /usr/bin/cc

AS

  • 将汇编文件生成目标文件(汇编文件使用的是指令助记符,AS将它翻译成机器码)

  • 目标文件包括文件头,代码段,数据段,bss段

https://www.jianshu.com/p/a9dfd55792e7

AR

  • 打包器,用于库操作,可以通过该工具从一个库中删除或者增加目标代码模块

  • 用于创建静态库.a文件

https://blog.csdn.net/EastonWoo/article/details/8241693

LD

  • 链接器,为前面生成的目标代码分配地址空间,将多个目标文件链接成一个库或者是可执行文件

https://www.ibm.com/docs/zh/aix/7.3?topic=l-ld-command

GDB

  • 调试工具,可以对运行过程中的程序进行代码调试工作

https://blog.csdn.net/chen1415886044/article/details/105094688

STRIP

  • 以最终生成的可执行文件或者库文件作为输入,然后消除掉其中的源码。

https://www.cnblogs.com/schips/p/11868275.html

NM

  • 查看静态库文件中的符号表。(文件分析工具)

https://zhuanlan.zhihu.com/p/363014233

Objdump

  • 查看静态库或者动态库的方法签名。

https://ivanzz1001.github.io/records/post/linux/2018/04/09/linux-objdump

编译链

编译测试

#查看cpu信息
sysctl -n machdep.cpu.brand_string
#查看cpu核心数量
sysctl -n hw.physicalcpu
#查看cpu运行信息
top -o cpu

https://blog.csdn.net/weixin_43076600/article/details/132647181

编译ffmpeg开源库

https://juejin.cn/post/7074039778127609864

https://developer.android.com/ndk/guides/other_build_systems?hl=zh-cn

/Users/liu/Library/Android/sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/darwin-x86_64//bin/aarch64-linux-android-strip 
  • 遇到这个问题 可以去到手动指定strip的目录 在新的ndk之中有llvm-strip取代aarch64-linux-android-strip 如果遇到nm也是同样的解决办法

#!/bin/bash
#ndk路径
NDK=/Users/liu/Library/Android/sdk/ndk/25.1.8937393
#主机标记 官网能看
TOOLCHAIN_ROOT_DIR=darwin-x86_64
#编译链路径
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/$TOOLCHAIN_ROOT_DIR/
#输出目录
OUTPUT=/Users/liu/Desktop/tools/ffmpeg
API=26
#要编译的ffmpeg内容方法
function build_android {
    echo "Compiling FFmpeg for $CPU"
    ./configure \
    --prefix=$OUTPUT \ #输出路径
    --disable-neon \
    --disable-hwaccels \
    --disable-gpl \
    --disable-postproc \
    --enable-shared \ #输出动态库 .so
    --enable-jni \ #启用jni支持 实现交互
    --disable-mediacodec \
    --disable-decoder=h264_mediacodec \
    --disable-static \ #禁止输出静态库 .a
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-avdevice \
    --disable-doc \
    --disable-symver \
    --cross-prefix=$CROSS_PREFIX \ #交叉编译前缀 进bin/看看就知道咋回事了
    --target-os=android \ #不理解 反正android平台要用
    --arch=$ARCH \
    --cpu=$CPU \
    --cc=$CC \
    --cxx=$CXX \
    --strip=$STRIP \
    --nm=$NM
    --enable-cross-compile \
    --sysroot=$SYSROOT \ #编译环境 头文件出问题找这个
    --extra-cflags="-fpic" #不用care 和上面差不多
    make clean #
    make -j8 #cpu核心数量
    make install #是否安装
    echo "The Compilation of FFmpeg for $CPU is completed"
}
#接下来是根据需要来决定
#armv8-a
ARCH=arm64
CPU=armv8-a
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/$TOOLCHAIN_ROOT_DIR/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
STRIP=$TOOLCHAIN/bin/llvm-strip
NM=$TOOLCHAIN/bin/llvm-nm
OPTIMIZE_CFLAGS="-march=$CPU"
build_android
#选项后面不允许出现注释 用的时候记得删掉

编译产物

  • 可以自己去编译v7 v8 x86 x86_64的so库

  • include为头文件 lib为so库文件