ndk开发-交叉编译

news2024/9/24 23:23:58

为什么要使用交叉编译:
在linux系统一般使用c c++编译可执行程序或者so库文件。该程序只能在当前linux系统执行,为了将生成文件可以再android平台运行,必须使用交叉编译。ndk中提供了跟多android平台交叉编译链,所以首先下载ndk工具。

ndk旧版本与新版本的编译链工具有改变,所以新版本与旧版本交叉编译的环境配置不同。
NDK 官网:https://developer.android.google.cn/ndk
编译环境:ubuntu linux系统

一、ndk旧版本交叉编译。以android-ndk-r17c版本为例。

下载旧版本地址(后面改成自己想要下载的版本)
https://dl.google.com/android/repository/android-ndk-r17c-linux-x86_64.zip
https://developer.android.google.cn/ndk/downloads/older_releases?hl=zh-cn#ndk-17c-downloads

1、在lunux系统搭建环境
下载android-ndk-r17c-linux-x86_64.zip版本
使用unzip android-ndk-r17c-linux-x86_64.zip 对压缩文件解压。
在这里插入图片描述

2、编写程序
1、编写可执行文件
编写一个简单的.c文件testadd.c,对这个文件编译一个可执行文件:

#include <stdio.h>
int main() {
 int a = 2;
 int b = 3;
 int sum = a + b;
 printf("a + b = %d\n",sum);
 return 0;
}

3、编译
命令:gcc testadd.c -o testadd ,编译可执行文件testadd。
gcc :为 linux系统原生的编译环境;
testadd.c: 为待编译的源文件;
-o :表示输出;
testadd: 输出的可执行文件(名字随便取)

4、运行
在linux平台运行程序结果:
在这里插入图片描述
将该可执行程序放到android设备/system/app(注意 需要将android设备root处理,否则没有权限),不能运行,报错如下。
在这里插入图片描述
使用交叉编译链编译。

二、使用android-ndk-r18b交叉编译链进行编译,生成可执行文件。
1、查看设备信息,选择正确编译链。
我的设备cpu平台为arm64,android10 ,api29。所以使用的编译链为aarch64-linux-android-gcc,路径
…/ndk/android-ndk-r17c/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gcc

2、编译
// 定义GCC 编译链路径
export GCC_NDK_17=/home/lily/ffmpeg/ndk/android-ndk-r17c/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gcc
![在这里插入图片描述](https://img-blog.csdnimg.cn/5c6413edcf544c67b080aa2c615c50fa.png
使用GCC_NDK_17编译链进行编译 ${GCC_NDK_17} testadd.c -o ndktestadd 报错,找不到头文件:
在这里插入图片描述
// 定义头文件及头文件所在库路径(我的设备是api29,但ndk17版本只有android-28,所以这里先使用android-28平台试一试)
库文件路径:/home/lily/ffmpeg/ndk/android-ndk-r17c/platforms/android-28/arch-arm64
头文件路径:/home/lily/ffmpeg/ndk/android-ndk-r17c/sysroot/usr/include
export FLAG_NDK_17=“–sysroot=/home/lily/ffmpeg/ndk/android-ndk-r17c/platforms/android-28/arch-arm64 -isystem /home/lily/ffmpeg/ndk/android-ndk-r17c/sysroot/usr/include”

再次编译:${GCC_NDK_17} ${FLAG_NDK_17} testadd.c -o ndktestadd 报错:
在这里插入图片描述
找不到ASM。
定义ASM路径:export ASM_NDK_17=/home/lily/ffmpeg/ndk/android-ndk-r17c/sysroot/usr/include/aarch64-linux-android
在这里插入图片描述
添加到FLAG:export FLAG_NDK_17=“–sysroot=/home/lily/ffmpeg/ndk/android-ndk-r17c/platforms/android-28/arch-arm64 -isystem /home/lily/ffmpeg/ndk/android-ndk-r17c/sysroot/usr/include -isystem ${ASM_NDK_17}”
在这里插入图片描述
再次编译:
${GCC_NDK_17} ${FLAG_NDK_17} testadd.c -o ndktestadd 生成可执行文件ndktestadd 。同样push到设备,是否能够执行。
在这里插入图片描述
修改编译命令,再次编译:
${GCC_NDK_17} ${FLAG_NDK_17} -pie testadd.c -o ndktestadd 可以生成可执行文件。同样push到设备,是否能够执行。
在这里插入图片描述
可以执行。交叉编译成功。
注意:本事例中使用ndk-19,ndk-20版本 没有对应gcc编译链,使用ndk-18版本,使用对应gcc编译链报错。因此,使用ndk-17版本验证。

以上命令使用的均为临时环境变量,下面将环境变量配置为全局环境变量。
打开文件:vi /home/lily/.bashrc(注意.bashrc为虚拟文件)在文件最下面添加一下路径:

#ndk-17
export NDK_17_ROOT="/home/lily/ffmpeg/ndk/android-ndk-r17c"
export NDK_17_HEAD="${NDK_17_ROOT}/sysroot/usr/include"
export NDK_17_ASM="${NDK_17_ROOT}/sysroot/usr/include/aarch64-linux-android"
export NDK_17_GCC_ARM64="${NDK_17_ROOT}/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gcc"
export NDK_17_SO_ARM64="${NDK_17_ROOT}/platforms/android-28/arch-arm64"
export NDK_17_FLAG_ARM64="--sysroot=${NDK_17_SO_ARM64} -isystem ${NDK_17_HEAD} -isystem ${NDK_17_ASM}"

在这里插入图片描述
编译:${NDK_17_GCC_ARM64} ${NDK_17_FLAG_ARM64} -pie testadd.c -o ndktestadd

三、ndk-17 编译动/静态库

// testadd.h
#include <stdio.h>
int add();

// testadd.c
#include "testadd.h"
int add() {
 int a = 2;
 int b = 3;
 int sum = a + b;
 printf("a + b = %d\n",sum);
 return sum;
}

使用交叉编译动态库:
${NDK_17_GCC_ARM64} ${NDK_17_FLAG_ARM64} -fPIC -shared testadd.c -o libadd.so
在这里插入图片描述
使用交叉编译静态库
1)生成.o文件
${NDK_17_GCC_ARM64} N D K 1 7 F L A G A R M 64 − f P I C − c t e s t a d d . c − o t e s t a d d . o ! [ 在这里插入图片描述 ] ( h t t p s : / / i m g − b l o g . c s d n i m g . c n / 21 b 8 c e e 6999 c 43 d 2 b 8 f f d 6 b 69 f d 8 f b 16. p n g ) 2 )生成 . a 静态库全局环境添加编译静态库编译链: e x p o r t N D K 1 7 A R A R M 64 = " {NDK_17_FLAG_ARM64} -fPIC -c testadd.c -o testadd.o ![在这里插入图片描述](https://img-blog.csdnimg.cn/21b8cee6999c43d2b8ffd6b69fd8fb16.png) 2)生成.a静态库 全局环境添加编译静态库编译链: export NDK_17_AR_ARM64=" NDK17FLAGARM64fPICctestadd.cotestadd.o![在这里插入图片描述](https://imgblog.csdnimg.cn/21b8cee6999c43d2b8ffd6b69fd8fb16.png)2)生成.a静态库全局环境添加编译静态库编译链:exportNDK17ARARM64="{NDK_17_ROOT}/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar"
在这里插入图片描述
编译生成libtestadd.a
$NDK_17_AR_ARM64 rcs -o libtestadd.a testadd.o
在这里插入图片描述
以上,使用ndk-17版本交叉编译生成可执行文件、动态库、静态库完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/890242.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FPGA应用学习笔记-----布图布线

分割可以将运行时间惊人地减少到三个小时更小的布局布线操作&#xff0c;主要的结构不影响另一个&#xff01;和增量设计流程一样 关键路径布图&#xff1a; 对于不同的模块有不同的电路和不同的关键路径&#xff0c; 布图没有主要的分割&#xff0c;布图由两个小的区域组成&a…

KDD 2023 获奖论文公布,港中文、港科大等获最佳论文奖

ACM SIGKDD&#xff08;国际数据挖掘与知识发现大会&#xff0c;KDD&#xff09;是数据挖掘领域历史最悠久、规模最大的国际顶级学术会议&#xff0c;也是首个引入大数据、数据科学、预测分析、众包等概念的会议。 今年&#xff0c;第29届 KDD 大会于上周在美国加州长滩圆满结…

C语言入门教程,C语言学习教程(非常详细)第五章 循环结构与选择结构

C语言if else语句详解 前面我们看到的代码都是顺序执行的&#xff0c;也就是先执行第一条语句&#xff0c;然后是第二条、第三条……一直到最后一条语句&#xff0c;这称为顺序结构。 但是对于很多情况&#xff0c;顺序结构的代码是远远不够的&#xff0c;比如一个程序限制了只…

【Javaswing课设源码】学生信息管理 Mysql课程设计 管理员 教师 学生

文章目录 系统介绍 系统介绍 大学时代弄的一个课设&#xff0c;当时百度[学长敲代码]找的代做&#xff0c;代码思路很清晰&#xff0c;完全按照我的功能需求去做的&#xff0c;主要是价格便宜&#xff0c;真的爱了&#xff0c;现在回头学习也是不错的一个项目。大概内容如下 本…

springboot里 用zxing 生成二维码

引入pom <!--二维码依赖--><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.3</version></dependency><dependency><groupId>com.google.zxing</groupId>…

【分类讨论】CF1674 E

Problem - E - Codeforces 题意&#xff1a; 思路&#xff1a; 样例&#xff1a; 这种分类讨论的题&#xff0c;主要是去看答案的最终来源是哪几种情况&#xff0c;这几种情况得不重不漏 Code&#xff1a; #include <bits/stdc.h>#define int long longusing i64 lon…

尚硅谷css3笔记

目录 一、新增长度单位 二、新增盒子属性 1.border-box 怪异盒模型 2.resize 调整盒子大小 3.box-shadow 盒子阴影 案例&#xff1a;鼠标悬浮盒子上时&#xff0c;盒子有一个过度的阴影效果 三、新增背景属性 1.background-origin 设置背景图的原点 2.background-clip 设置背…

基于IMX6ULLmini的linux裸机开发系列一:汇编点亮LED

思来想去还是决定记录一下点灯&#xff0c;毕竟万物皆点灯嘛 编程步骤 使能GPIO时钟 设置引脚复用为GPIO 设置引脚属性(上下拉、速率、驱动能力) 控制GPIO引脚输出高低电平 使能GPIO时钟 其实和32差不多 先找到控制LED灯的引脚&#xff0c;也就是原理图 文件名 C:/Us…

自动提示功能消失解决方案

如果绿叶子是不可点击状态&#xff0c;可以点一下列表中的配置文件

43、TCP报文(一)

本节内容开始&#xff0c;我们正式学习TCP协议中具体的一些原理。首先&#xff0c;最重要的内容仍然是这个协议的封装结构和首部格式&#xff0c;因为这里面牵扯到一些环环相扣的知识点&#xff0c;例如ACK、SYN等等&#xff0c;如果这些内容不能很好的理解&#xff0c;那么后续…

A. Copil Copac Draws Trees(Codeforces Round 875 (Div. 1))

Copil Copac is given a list of n − 1 n-1 n−1 edges describing a tree of n n n vertices. He decides to draw it using the following algorithm: Step 0 0 0: Draws the first vertex (vertex 1 1 1). Go to step 1 1 1.Step 1 1 1: For every edge in the inpu…

号外号外,最经典的16S数据库Greengenes2更新啦!!!

没错&#xff0c;这是真的&#xff0c;沉积十年之后&#xff0c;多样性研究中最经典的16S数据库——Greengenes数据库&#xff0c;竟&#xff01;然&#xff01;更&#xff01;新&#xff01;了&#xff01;惊不惊喜&#xff01;意不意外&#xff01; 遥想当年小编还是一个小白…

vue 数字递增(滚动从0到)

使用 html <Incremental :startVal"0" :endVal"1000" :duration"500" />js&#xff1a; import Incremental from /utils/num/numViewjs let lastTime 0 const prefixes webkit moz ms o.split( ) // 各浏览器前缀let requestAnimatio…

基于YOLOv5n/s/m不同参数量级模型开发构建茶叶嫩芽检测识别模型,使用pruning剪枝技术来对模型进行轻量化处理,探索不同剪枝水平下模型性能影响

今天有点时间就想着之前遗留的一个问题正好拿过来做一下看看&#xff0c;主要的目的就是想要对训练好的目标检测模型进行剪枝处理&#xff0c;这里就以茶叶嫩芽检测数据场景为例了&#xff0c;在我前面的博文中已经有过相关的实践介绍了&#xff0c;感兴趣的话可以自行移步阅读…

QT的设计器介绍

设计器介绍 Qt制作 UI 界面&#xff0c;一般可以通过UI制作工具QtDesigner和纯代码编写两种方式来实现。纯代码实现暂时在这里不阐述了在后续布局章节详细说明&#xff0c;QtDesigner已经继承到开发环境中&#xff0c;在工程中直接双击ui文件就可以直接在QtDesigner设计器中打…

AtCoder Beginner Contest 314 E题题解

文章目录 Roulettes问题建模问题分析1.分析每个转盘对所求的作用2.从集合的角度思考每个积分的贡献代码 Roulettes 问题建模 给定n个轮盘&#xff0c;每个轮盘上有p个积分&#xff0c;每次转动轮盘需要一定的代价&#xff0c;在转动轮盘后可以等概率获得p个积分中的一个&#…

【通俗易懂】如何使用GitHub上传文件,如何用git在github上传文件

目录 创建 GitHub 仓库 使用 Git 进行操作 步骤 1&#xff1a;初始化本地仓库 步骤 2&#xff1a;切换默认分支 步骤 3&#xff1a;连接到远程仓库 步骤 4&#xff1a;获取远程更改 步骤 5&#xff1a;添加文件到暂存区 步骤 6&#xff1a;提交更改 步骤 7&#xff1a…

频繁full gc 调参

Error message from spark is:java.lang.Exception: application_1678793738534_17900289 Driver Disassociated [akka.tcp://sparkDriverClient11.71.243.117:37931] <- [akka.tcp://sparkYarnSQLAM9.10.130.149:38513] disassociated! 日志里频繁full gc &#xff0c;可以…

nginx代理请求到内网不同服务器

需求&#xff1a;之前用的是frp做的内网穿透&#xff0c;但是每次电脑断电重启&#xff0c;路由或者端口会冲突&#xff0c;现在使用汉土云盒替换frp。 需要把公网ip映射到任意一台内网服务器上&#xff0c;然后在这台内网服务器上用Nginx做代理即可访问内网其它服务器&#xf…

微服务中间件--微服务保护

微服务保护 微服务保护a.sentinelb.sentinel限流规则1) 流控模式1.a) 关联模式1.b) 链路模式 2) 流控效果2.a) 预热模式2.b) 排队等待 3) 热点参数限流 c.隔离和降级1) Feign整合Sentinel2) 线程隔离2.a) 线程隔离&#xff08;舱壁模式&#xff09; 3) 熔断降级3.a) 熔断策略-慢…