当前位置: 首页 > news >正文

为 android编译 luajit库、 交叉编译

时间: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.zipunzip 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选取:

ABITriple
armeabi-v7aarmv7a-linux-androideabi
arm64-v8aaarch64-linux-android
x86i686-linux-android
x86-64x86_64-linux-android

注意: r19 之后 anrdoid 仅提供 clang 交叉编译工具,需要统一使用目录下的 llvm 工具
我们r21编译器位于 $NDK/toolchains/llvm/prebuilt/linux-x86_64/bin,再就是需要确认支持的最小的API等级,一般21就行了

,截止到23年下半年
注意:运行要先去 src/Makefile里 把CC= $(DEFAULT_CC)这里修改一下,让它优先使用我们指定的CC:

ifndef CC
CC= $(DEFAULT_CC) #注意这里如果为了美观想要缩进的话不能使用‘tab’,因为 Makefile里用‘tab’缩进会当作是指令来运行 
endif

先编译一个arm64-v8a的试试 ,我们要使用
$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-androideabi21-clang, 完整的脚本 :

NDK=你的ND根目录API=21
NDKTRIPLE=aarch64-linux-android
NDKBIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/binmake 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加在脚本里:

NDK=你的ND根目录make cleanAPI=21
NDKTRIPLE=aarch64-linux-android
NDKBIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/binmake 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命名的规则跟其他的不太一样:

NDK=$NDK_r21_ROOT
NDKBIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin
API=21#当前目录
CUR_PATH=$(cd "$(dirname $0)"pwd
)#build目录
BUILD_PATH=$CUR_PATH/build
#每次生成前清理 build目录
rm -rf $BUILD_PATH#创建目录
makedir() {if [ ! -x "$1" ]; thenmkdir -p "$1"fi
}makedir $BUILD_PATH#移动lib到build目录下
putto() {makedir $1if [ -f $CUR_PATH/src/libluajit.a ]; thenmv $CUR_PATH/src/libluajit.a $1/libluajit.afi
}# armeabi-v7a
NDKTRIPLE=armv7a-linux-androideabi
make clean
make CC="clang -m32" CROSS=$NDKBIN/$NDKTRIPLE$API- TARGET_AR="$NDKBIN/arm-linux-androideabi-ar rcus" TARGET_STRIP=$NDKBIN/arm-linux-androideabi-strip
putto $BUILD_PATH/armeabi-v7a# arm64-v8a
NDKTRIPLE=aarch64-linux-android
make clean
make CC=clang CROSS=$NDKBIN/$NDKTRIPLE$API- TARGET_AR="$NDKBIN/$NDKTRIPLE-ar rcus" TARGET_STRIP=$NDKBIN/$NDKTRIPLE-strip
putto $BUILD_PATH/arm64-v8a# x86
NDKTRIPLE=i686-linux-android
make clean
make CC="clang -m32" CROSS=$NDKBIN/$NDKTRIPLE$API- TARGET_AR="$NDKBIN/$NDKTRIPLE-ar rcus" TARGET_STRIP=$NDKBIN/$NDKTRIPLE-strip
putto $BUILD_PATH/x86# x86_64
NDKTRIPLE=x86_64-linux-android
make clean
make CC=clang CROSS=$NDKBIN/$NDKTRIPLE$API- TARGET_AR="$NDKBIN/$NDKTRIPLE-ar rcus" TARGET_STRIP=$NDKBIN/$NDKTRIPLE-strip
putto $BUILD_PATH/x86_64
http://www.lryc.cn/news/403801.html

相关文章:

  • 【音视频】音频重采样
  • 卷积神经网络学习问题总结
  • 嵌入式面试总结
  • 超简单安装指定版本的clickhouse
  • FlowUs横向对比几款笔记应用的优势所在
  • 收银系统源码-千呼新零售收银视频介绍
  • 从Catalog说到拜义父-《分析模式》漫谈11
  • Qt判定鼠标是否在该多边形的线条上
  • 【笔记:3D航路规划算法】一、随机搜索锚点(python实现,讲解思路)
  • ubuntu如何彻底卸载android studio?
  • 使用Windows Linux 子系统安装 Tensorflow,并使用GPU环境
  • C++案例三:猜数字游戏
  • LNMP架构部署及应用
  • 【医学影像】X86+FPGA:支持AI医学影像设备应用的工控主板,赋能CT、MRI、X线、超声等医学影像设备
  • 【PostgreSQL】PostgreSQL简史
  • Linux的热插拔UDEV机制和守护进程
  • laravel框架基础通识-新手
  • c++ extern 关键字
  • Meta KDD Cup 2024 CRAG: Comphrehensive RAG Benchmark参赛指南(写了一半跑去改大论文了所以没正式参赛)
  • 系统架构设计师教程 第3章 信息系统基础知识-3.7 企业资源规划(ERP)-解读
  • windows实现自动化按键
  • 阿里云 https证书部署
  • DX-10A信号继电器 柜内安装,板前接线 约瑟JOSEF
  • 芯片光刻后的晶片多层组合构成的吗
  • OpenGL-ES 学习(7) ---- VBO EBO 和 VAO
  • github如何实现和gitlab的同步
  • 内网隧道——隧道技术基础
  • NAS新品“翻车”后,绿联科技要上市了
  • kafka-client如何打印连接日志
  • 1、springboot3 vue3开发平台-后端-项目构建