ndk开发-交叉编译

为什么要使用交叉编译:
在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.hqwc.cn/news/70941.html

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

相关文章

【JUC】线程池ThreadPoolTaskExecutor与面试题解读

1、ThreadPoolTaskExecutor 创建线程池 从它的创建和使用说起&#xff0c;创建和使用的代码如下&#xff1a; 创建&#xff1a; ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor();executor.setCorePoolSize(corePoolSize);executor.setMaxPoolSize(maxPoolSize…

Yii2 advanced 框架,自定义Log日志方案

背景 近期在使用 【Yii2 advanced】框架时 在接触到 微信支付回调操作时&#xff0c;想要将微信服务器请求的参数信息记录下来 但是&#xff0c;不喜欢框架自带的日志配置方式 在此&#xff0c;推荐使用一种自定义文件目录与log记录形式的方案 希望有此需求的道友&#xff0c;能…

团团代码生成器V1.0:一键生成完整的CRUD功能(提供Gitee源码)

前言&#xff1a;在日常开发的中&#xff0c;经常会需要重复写一些基础的增删改查接口&#xff0c;虽说不难&#xff0c;但是会耗费我们一些时间&#xff0c;所以我自己开发了一套纯SpringBoot实现的代码生成器&#xff0c;可以为我们生成单条数据的增删改查&#xff0c;还可以…

ArcGIS Pro基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合、案例全流程科研能力提升

目录 第一章 入门篇 GIS理论及ArcGIS Pro基础 第二章 基础篇 ArcGIS数据管理与转换 第三章 数据编辑与查询、拓扑检查 第四章 制图篇 地图符号与版面设计 第五章 空间分析篇 ArcGIS矢量空间分析及应用 第六章 ArcGIS栅格空间分析及应用 第七章 影像篇 遥感影像处理 第八…

Java基础知识实际应用(学生信息管理系统、猜拳小游戏、打印日历)

一、Java学生信息管理系统 这个系统包含了添加、修改、删除、查询和显示所有学生信息等功能。您可以在此基础上进行修改和完善&#xff0c;以适应您的需求。 import java.util.Scanner;public class StudentManagementSystem {private static Scanner scanner new Scanner(S…

分布式作业调度框架——ElasticJob

1、简介 ElasticJob 是面向互联网生态和海量任务的分布式调度解决方案&#xff0c;由两个相互独立的子项目 ElasticJob-Lite 和 ElasticJob-Cloud 组成。 它通过弹性调度、资源管控、以及作业治理的功能&#xff0c;打造一个适用于互联网场景的分布式调度解决方案&#xff0c;…

内网穿透——使用Windows自带的网站程序建立网站

文章目录 1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试 3. Cpolar内网穿透3.1 下载安装Cpolar3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5.结语 1.前言 在网上各种教程和介绍中&#xff0c;搭建网页都会借助各种软件的帮助&#xff0c;比如…

SpringCloud Gateway:status: 503 error: Service Unavailable

使用SpringCloud Gateway路由请求时&#xff0c;出现如下错误 yml配置如下&#xff1a; 可能的一种原因是&#xff1a;yml配置了gateway.discovery.locator.enabledtrue&#xff0c;此时gateway会使用负载均衡模式路由请求&#xff0c;但是SpringCloud Alibaba删除了Ribbon的…

Maven基础之仓库、命令、插件机制

文章目录 Maven 仓库中央仓库和本地仓库中央仓库本地仓库 Maven 命令generate 命令compile 命令clean 命令test 命令package 命令install 命令 Maven 插件机制官方插件&#xff1a;Compile 插件Tomcat 7 插件 Maven 仓库 中央仓库和本地仓库 [✎] 简单一点说 中央仓库是一个网…

springcloud3 hystrix实现服务降级的案例配置2

一 服务降级的说明 1.1 服务降级说明 "服务器忙&#xff0c;请稍后在试"不让客户达等待&#xff0c;立即返回一个友好的提示。 1.2 服务降级的触发情况 1.程序运行异常&#xff1b; 2.超时&#xff1b; 3.服务熔断触发服务降级&#xff1b;4 .线程池/信号量打…

第十三课:QtCmd 命令行终端应用程序开发

功能描述&#xff1a;开发一个类似于 Windows 命令行提示符或 Linux 命令行终端的应用程序 一、最终演示效果 QtCmd 不是因为它是 Qt 的组件&#xff0c;而是采用 Qt 开发了一个类似 Windows 命令提示符或者 Linux 命令行终端的应用程序&#xff0c;故取名为 QtCmd。 上述演示…

Excel(1):表头或列头冻结

1.需求 对于较大的excel&#xff0c;通常需要固定一部分内容&#xff0c;另一份内容为可翻动。 2.解决方式 在视图中选择冻结窗格&#xff0c;需要注意的是&#xff0c;选择冻结窗格时&#xff0c;窗格的左上方的表格区域是固定不动的&#xff0c;只可以向下或者向右活动。