为 android编译 luajit库、 交叉编译

打印 上一主题 下一主题

主题 495|帖子 495|积分 1485

时间:20200719
本机环境:iMac2017 macOS11.4
参考:
官方的文档:Use the NDK with other build systems
写在前边:交叉编译跟平凡编译雷同,无非是使用特别的编译器、链接器生成动态或静态库; make 本质上是按照 Makefie 中的规则来编译源码,编译碰到问题多去里边找找线索
使用Docker + ubuntu镜像 编译

1.安装docker
2.拉取ubuntu 镜像, docker pull ubuntu:20.04
3.挂载一个本地目录 用于与Host共享
4.进入容器命令行 切换shell脚本 /bin/bash
5.更新apt: apt update,安装wget : apt install wget
6.选择一个NDK版本,旧版NDK 下载,这里 我下载的是 r21 ,wget https://dl.google.com/android/repository/android-ndk-r21e-linux-x86_64.zip
7.安装unzip: apt install unzip
8.解压ndk: unzip android-ndk-r21e-linux-x86_64.zip 默认是解压到 ./android-ndk-r21e
9.保存一下ndk的路径,使用pwd可以查看当前路径 记好ndk 的路径 【当前路径/android-ndk-r21e】
10.下载luajit并解压,我选择的是v2.1.ROLLING这个Tag, wget https://github.com/LuaJIT/LuaJIT/archive/refs/tags/v2.1.ROLLING.zip、unzip v2.1.ROLLING.zip
11.进入到v2.1.ROLLING目录:cd v2.1.ROLLING,使用ls -l查看文件列表,可以看到有Makefile,打开轻微看一下可以发现它是$(MAKE) -C src 来编译src目录下的源码,打开src目录,里边也有Makefile,这里就是编译的细节,可以看到 STATIC_CC = $(CROSS)$(CC) ,这里我们可以通过设置CROSS、CC 的值来指定编译工具,接下来我们写个脚本来实验编译
12.新建脚本:touch build_android.sh, 添加实验权限:chmod +x build_android.sh ,
13.安装vim: apt install vim, 编辑脚本:vim build_android.sh
首先要相识一下编译的工具链的选择,位于 $NDK/toolchains/ 目录下,稍后的CROSS 变量设置就是根据这里的三元组(Triple)来指定的,需要根据目标ABI选取:
ABITriplearmeabi-v7aarmv7a-linux-androideabiarm64-v8aaarch64-linux-androidx86i686-linux-androidx86-64x86_64-linux-android 注意: r19 之后 anrdoid 仅提供 clang 交叉编译工具,需要统一使用目录下的 llvm 工具
我们r21编译器位于 $NDK/toolchains/llvm/prebuilt/linux-x86_64/bin,再就是需要确认支持的最小的API品级,一般21就行了

注意:运行要先去 src/Makefile里 把CC= $(DEFAULT_CC)这里修改一下,让它优先使用我们指定的CC:
  1. ifndef CC
  2. CC= $(DEFAULT_CC) #注意这里如果为了美观想要缩进的话不能使用‘tab’,因为 Makefile里用‘tab’缩进会当作是指令来运行
  3. endif
复制代码
先编译一个arm64-v8a的试试 ,我们要使用
$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-androideabi21-clang, 完整的脚本 :
  1. NDK=你的ND根目录
  2. API=21
  3. NDKTRIPLE=aarch64-linux-android
  4. NDKBIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin
  5. make CC=clang CROSS=$NDKBIN/$NDKTRIPLE$API-
复制代码
运行脚本,报错:

网上搜了一下说Error 127 是找不到ar工具,去NDKBIN里边看了一下,除了 clang/clang++ 其它工具的定名都是不带API的,以是Makefile 中全部的 非$(CROSS)$(CC) 格式的变量都要手动指定,先修改Makefile:
   TARGET_AR= $(CROSS)ar rcus
TARGET_STRIP= $(CROSS)strip
  改为:
   ifndef TARGET_AR
TARGET_AR= $(CROSS)ar rcus
endif
  ifndef TARGET_STRIP
TARGET_STRIP= $(CROSS)strip
endif
  再来是脚本文件,通常Makefile 中都会提供clean命令,用来清理编译的中间文件之类的,我们也把make clean加在脚本里:
  1. NDK=你的ND根目录
  2. make clean
  3. API=21
  4. NDKTRIPLE=aarch64-linux-android
  5. NDKBIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin
  6. make CC=clang CROSS=$NDKBIN/$NDKTRIPLE$API- TARGET_AR="$NDKBIN/$NDKTRIPLE-ar rcus" TARGET_STRIP=$NDKBIN/$NDKTRIPLE-strip
复制代码
运行脚本,乐成!
一般来说4个ABI版本的库都是需要的,我们轻微改造一下脚本,把每种都编译出来然后统一放到 build 目录下,有一点需要注意,armeabi-v7a 和 x86 是32位,需要带上 "-m32"参数 ,尚有就是 armeabi-v7a 的TARGET_AR/TARGET_STRIP定名的规则跟其他的不太一样:
  1. NDK=$NDK_r21_ROOT
  2. NDKBIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin
  3. API=21
  4. #当前目录
  5. CUR_PATH=$(
  6.   cd "$(dirname $0)"
  7.   pwd
  8. )
  9. #build目录
  10. BUILD_PATH=$CUR_PATH/build
  11. #每次生成前清理 build目录
  12. rm -rf $BUILD_PATH
  13. #创建目录
  14. makedir() {
  15.   if [ ! -x "$1" ]; then
  16.     mkdir -p "$1"
  17.   fi
  18. }
  19. makedir $BUILD_PATH
  20. #移动lib到build目录下
  21. putto() {
  22.   makedir $1
  23.   if [ -f $CUR_PATH/src/libluajit.a ]; then
  24.     mv $CUR_PATH/src/libluajit.a $1/libluajit.a
  25.   fi
  26. }
  27. # armeabi-v7a
  28. NDKTRIPLE=armv7a-linux-androideabi
  29. make clean
  30. make CC="clang -m32" CROSS=$NDKBIN/$NDKTRIPLE$API- TARGET_AR="$NDKBIN/arm-linux-androideabi-ar rcus" TARGET_STRIP=$NDKBIN/arm-linux-androideabi-strip
  31. putto $BUILD_PATH/armeabi-v7a
  32. # arm64-v8a
  33. NDKTRIPLE=aarch64-linux-android
  34. make clean
  35. make CC=clang CROSS=$NDKBIN/$NDKTRIPLE$API- TARGET_AR="$NDKBIN/$NDKTRIPLE-ar rcus" TARGET_STRIP=$NDKBIN/$NDKTRIPLE-strip
  36. putto $BUILD_PATH/arm64-v8a
  37. # x86
  38. NDKTRIPLE=i686-linux-android
  39. make clean
  40. make CC="clang -m32" CROSS=$NDKBIN/$NDKTRIPLE$API- TARGET_AR="$NDKBIN/$NDKTRIPLE-ar rcus" TARGET_STRIP=$NDKBIN/$NDKTRIPLE-strip
  41. putto $BUILD_PATH/x86
  42. # x86_64
  43. NDKTRIPLE=x86_64-linux-android
  44. make clean
  45. make CC=clang CROSS=$NDKBIN/$NDKTRIPLE$API- TARGET_AR="$NDKBIN/$NDKTRIPLE-ar rcus" TARGET_STRIP=$NDKBIN/$NDKTRIPLE-strip
  46. putto $BUILD_PATH/x86_64
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

梦见你的名字

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表