为 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.rhkb.cn/news/380639.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

哈默纳科HarmonicDrive减速机组装注意事项

在机械行业中,精密传动设备HarmonicDrive减速机对于维持机械运作的稳定性和高效性起着至关重要的作用。然而在减速机的组装过程中,任何一个细微的错误都可能导致其运转时出现振动、异响等不良现象,严重时甚至可能影响整机的性能。因此&#x…

Python+Django+MySQL的新闻发布管理系统【附源码,运行简单】

PythonDjangoMySQL的新闻发布管理系统【附源码,运行简单】 总览 1、《新闻发布管理系统》1.1 方案设计说明书设计目标工具列表 2、详细设计2.1 登录2.2 程序主页面2.3 新闻新增界面2.4 文章编辑界面2.5 新闻详情页2.7 其他功能贴图 3、下载 总览 自己做的项目&…

Flink调优详解:案例解析(第42天)

系列文章目录 一、Flink-任务参数配置 二、Flink-SQL调优 三、阿里云Flink调优 文章目录 系列文章目录前言一、Flink-任务参数配置1.1 运行时参数1.2 优化器参数1.3 表参数 二、Flink-SQL调优2.1 mini-batch聚合2.2 两阶段聚合2.3 分桶2.4 filter去重(了解&#xf…

代码解读:Diffusion Models中的长宽桶技术(Aspect Ratio Bucketing)

Diffusion Models专栏文章汇总:入门与实战 前言:自从SDXL提出了长宽桶技术之后,彻底解决了不同长宽比的图像输入问题,现在已经成为训练扩散模型必选的方案。这篇博客从代码详细解读如何在模型训练的时候运用长宽桶技术(Aspect Rat…

UNiapp 微信小程序渐变不生效

开始用的一直是这个,调试一直没问题,但是重新启动就没生效,经查询这个不适合小程序使用:不适合没生效 background-image:linear-gradient(to right, #33f38d8a,#6dd5ed00); 正确使用下面这个: 生效,适合…

Python list comprehension (列表推导式 - 列表解析式 - 列表生成式)

Python list comprehension {列表推导式 - 列表解析式 - 列表生成式} 1. Python list comprehension (列表推导式 - 列表解析式 - 列表生成式)2. Example3. ExampleReferences Python 中的列表解析式并不是用来解决全新的问题,只是为解决已有问题提供新的语法。 列…

(10)深入理解pandas的核心数据结构:DataFrame高效数据清洗技巧

目录 前言1. DataFrame数据清洗1.1 处理缺失值(NaNs)1.1.1 数据准备1.1.2 读取数据1.1.3 查找具有 null 值或缺失值的行和列1.1.4 计算每列缺失值的总数1.1.5 删除包含 null 值或缺失值的行1.1.6 利用 .fillna() 方法用Portfolio …

Windows搭建RTMP视频流服务器

参考了一篇文章,见文末。 博客中nginx下载地址失效,附上一个有效的地址: Index of /download/ 另外,在搭建过程中,遇到的问题总结如下: 1 两个压缩包下载解压并重命名后,需要 将nginx-rtmp…

如何使用简鹿水印助手或 Photoshop 给照片添加文字

在社交媒体中,为照片添加个性化的文字已经成为了一种流行趋势。无论是添加注释、引用名言还是表达情感,文字都能够为图片增添额外的意义和风格。本篇文章将使用“简鹿水印助手”和“Adobe Photoshop”这两种工具给照片添加文字的详细步骤。 使用简鹿水印…

【python基础】组合数据类型:元组、列表、集合、映射

文章目录 一. 序列类型1. 元组类型2. 列表类型(list)2.1. 列表创建2.2 列表操作2.3. 列表元素遍历 ing元素列表求平均值删除散的倍数 二. 集合类型(set)三. 映射类型(map)1. 字典创建2. 字典操作3. 字典遍历…

【EI检索】第二届机器视觉、图像处理与影像技术国际会议(MVIPIT 2024)

一、会议信息 大会官网:www.mvipit.org 官方邮箱:mvipit163.com 会议出版:IEEE CPS 出版 会议检索:EI & Scopus 检索 会议地点:河北张家口 会议时间:2024 年 9 月 13 日-9 月 15 日 二、征稿主题…

【香橙派开发板测试】:在黑科技Orange Pi AIpro部署YOLOv8深度学习纤维分割检测模型

文章目录 🚀🚀🚀前言一、1️⃣ Orange Pi AIpro开发板相关介绍1.1 🎓 核心配置1.2 ✨开发板接口详情图1.3 ⭐️开箱展示 二、2️⃣配置开发板详细教程2.1 🎓 烧录镜像系统2.2 ✨配置网络2.3 ⭐️使用SSH连接主板 三、…

Web开发:图片九宫格与非九宫格动态切换效果(HTML、CSS、JavaScript)

目录 一、业务需求 二、实现思路 三、实现过程 1、基础页面 2、图片大小调整 3、图片位置调整 4、鼠标控制切换 5、添加过渡 四、完整代码 一、业务需求 默认显示基础图片; 当鼠标移入,使用九宫格效果展示图片; 当鼠标离开&#…

CTF-Web习题:[BJDCTF2020]ZJCTF,不过如此

题目链接:[BJDCTF2020]ZJCTF,不过如此 解题思路 访问靶场链接,出现的是一段php源码,接下来做一下代码审阅,发现这是一道涉及文件包含的题 主要PHP代码语义: file_get_contents($text,r); 把$text变量所…

基于NeRF的路面重建算法——RoME / EMIE-MAP / RoGS

基于NeRF的路面重建算法——RoME / EMIE-MAP / RoGS 1. RoMe1.1 Mesh Initialization / Waypoint Sampling1.2 Optimization1.3 Experiments 2. EMIE-MAP2.1 Road Surface Representation based on Explicit mesh and Implicit Encoding2.2 Optimizing Strategies2.3 Experimen…

Uniapp鸿蒙项目实战

Uniapp鸿蒙项目实战 24.7.6 Dcloud发布了uniapp兼容鸿蒙的文档:Uniapp开发鸿蒙应用 在实际使用中发现一些问题,开贴记录一下 设备准备 windows电脑准备(家庭版不行,教育版、企业版、专业版也可以,不像uniapp说的只有…

Promise 详解(原理篇)

目录 什么是 Promise 实现一个 Promise Promise 的声明 解决基本状态 添加 then 方法 解决异步实现 解决链式调用 完成 resolvePromise 函数 解决其他问题 添加 catch 方法 添加 finally 方法 添加 resolve、reject、race、all 等方法 如何验证我们的 Promise 是否…

分布式搜索之Elasticsearch入门

Elasticsearch 是什么 Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。 Elastic Stack 又是什么呢&a…

企业须善用数字化杠杆经营获取数字化时代红利

​在当今数字化时代,企业面临着新机遇和新挑战。数字化技术的迅速发展正在重塑商业格局,企业若能善用数字化杠杆经营,将能够在激烈的市场竞争中脱颖而出,获取丰厚的时代红利。 数字化杠杆的内涵 数字化杠杆是指企业借助数字化技术…

SAPUI5基础知识16 - 深入理解MVC架构

1. 背景 经过一系列的练习,相信大家对于SAPUI5的应用程序已经有了直观的认识,我们在练习中介绍了视图、控制器、模型的概念和用法。在本篇博客中,让我们回顾总结下这些知识点,更深入地理解SAPUI5的MVC架构。 首先,让…