文章目录

  • I . NDK platforms 目录下的 函数库
  • II . Ubuntu 配置 NDK 交叉编译环境
  • III . 同时指定编译的头文件和库文件
  • IV . 指定编译的头文件
  • V . 指定编译的库文件
  • VI . 指定编译的头文件与库文件 示例

I . NDK platforms 目录下的 函数库


platforms 目录下的函数库:

1 . Android 版本目录 : platforms 中存储了各个 Android 版本编译时需要的动态库与静态库资源 , 如 android-29 中就是该版本对应的本地库资源 ;

2 . CPU 架构目录 :

在版本目录下存储的是不同的 CPU 处理器对应的库版本 , 如 arm , x86 处理器 , 32 位 与 64 位 等不同版本对应的本地库 ;

CPU 不同 , 其对应的指令集不同 , 相应编译出的动态库或静态库就不同 ;

3 . 函数库目录 :

在对应 CPU 目录下的 usr\lib 目录下 , 存储了该 Android 版本对应的 CPU 版本的动态库 与 静态库 ;

开发高性能音频时使用的 libOpenSLES.so , 打印日志使用的 liblog.so 库 , 就是在该目录下 ; 引入的 #include <android/log.h> 头文件对应的方法逻辑实现就在 liblog.so 库中 ;

II . Ubuntu 配置 NDK 交叉编译环境


独立使用 NDK 提供的交叉编译工具 , 需要在 Ubuntu Linux 下执行 , 因此这里我们下载 Linux 版本的 NDK ;

1 . NDK 下载地址 : https://developer.android.google.cn/ndk/downloads

历史版本的 NDK 下载地址 : https://developer.android.google.cn/ndk/downloads/older_releases.html

2 . 下载完毕会后在 Ubuntu 中解压文件 :

3 . 配置临时环境变量 :

① 目的 : 该临时环境变量 就是 NDK 中的交叉编译工具的路径 , 目的是方便调用 ;

② 执行指令 : export CC=/home/book/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc

③ CC 环境变量作用 : CC 是变量名 , 调用的时候使用 $CC main.c 即可调用上述路径中的 arm-linux-androideabi-gcc 工具编译 main.c 源文件 ;

④ 交叉编译 : 上述路径的编译器就是在 Linux 中编译 ARM CPU 指令集的函数库 , 由于是在 X86 芯片上编译 ARM 芯片的函数库 , 因此该操作叫做交叉编译 ;

4 . 尝试交叉编译 :

① main.c 源文件 :

#include <stdio.h>int main(){printf("main : test");return 0;
}

② 尝试编译 : 调用 $CC main.c 命令尝试编译 main.c 程序 , 发现如下问题 ;

book@book-virtual-machine:~/NDK$ $CC main.c
main.c:1:19: fatal error: stdio.h: No such file or directory#include <stdio.h>^
compilation terminated.
book@book-virtual-machine:~/NDK$ 

③ 分析原因 : 此处需要提供 stdio.h 对应的头文件与函数库 , 上面连头文件都没有找到 , 需要我们来指定 ;

下面开始说明如何指定头文件与库文件 ;

III . 同时指定编译的头文件和库文件


1 . 库文件 : 交叉编译需要的库文件就是上述 NDK platforms 目录下的 函数库 ;

2 . --sysroot 头文件与库文件查找目录设定 : 使用 --sysroot=XX 参数设置 ;

指定本次编译的 头文件 与 库文件 , 系统会自动到 XX/usr/include 目录下查找头文件 , 到 XX/usr/lib 目录下查找库文件 ;

IV . 指定编译的头文件


1 . -isysroot 头文件查找目录设定 : 使用 -isysroot YY 参数设置 ;

指定头文件查找目录 , 系统还会自动到 YY/usr/include 目录下查找头文件 ;

注意 : 该配置会覆盖 --sysroot=XX 参数查找头文件的配置 ;

2 . 同时设置 --sysroot=XX -isysroot=YY 情况 :

如果同时设置了 --sysroot=XX -isysroot=YY 两个参数 ,

会去 XX/usr/lib 目录下找库文件 ,
到 YY/usr/include 目录下查找头文件 ;

( 此时不再去 XX/usr/include 目录下查找头文件 )

3 . -isystem 设置头文件查找路径 : 使用 -isystem ZZ 参数设置 ;

设置后系统会直接去 ZZ 目录下查找头文件 ;

4 . -isysroot 与 -isystem 区别 :

两种参数配置的查找路径不同 ,

-isysroot 设定会去设定的目录下的 usr/include 目录下查找 .

-isystem 会直接到设置的目录下查找 ;

5 . -I 头文件查找目录 : 使用 -isystem KK 参数设置 ;

设置后系统会直接去 KK 目录下查找头文件 ;

6 . 头文件目录查找优先级 :

优先级从高到底 : -I > -isystem > -isysroot

V . 指定编译的库文件


1 . -L 指定库文件查找目录 : 使用 -L AA 参数设置 ;

设置该参数后 , 编译时系统会自动到 AA 目录下查找函数库 ;

2 . -l 指定链接的库名称 : 使用 -l libxxx.so 参数设置 ;

设置该参数后 , 系统会按照该路径加载该 libxxx.so 函数库 ;

VI . 指定编译的头文件与库文件 示例


1 . 设置临时环境变量 :

export CC=/home/book/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc

2 . NDK 头文件与库文件的目录 :
( 这里以 android-21 版本 ARM CPU 为例 )

① NDK 库文件目录 :

/home/book/NDK/android-ndk-r17c/platforms/android-21/arch-arm/user/lib

② NDK 库头文件目录 :

/home/book/NDK/android-ndk-r17c/sysroot/usr/include

/home/book/NDK/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi/asm

3 . 最终的指定头文件与函数库的编译指令 :

$CC --sysroot=/home/book/NDK/android-ndk-r17c/platforms/android-21/arch-arm -isystem /home/book/NDK/android-ndk-r17c/sysroot/usr/include -isystem /home/book/NDK/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi -pie main.c

命令解析 :

① $CC : arm-linux-androideabi-gcc 交叉编译工具的临时环境变量 , 执行 $CC 相当于执行 /home/book/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc 命令 ;

② 指定函数库 :

–sysroot=/home/book/NDK/android-ndk-r17c/platforms/android-21/arch-arm

指定函数库目录 , 必须这么写 , 因为真正要查找的是下层目录中的 usr/lib 目录 ;

③ 指定头文件 : 这里使用的是 -isystem , 不是 -isysroot , 因此目录可以写的随意一些 ;

-isystem /home/book/NDK/android-ndk-r17c/sysroot/usr/include

-isystem /home/book/NDK/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi

isysroot 指定的头文件必须在 usr/include 中 , -isystem 不必 ;

④ 指定需要在 Android 手机执行配置 : -pie

4 . 编译结果 :

该编译出的 a.out 可执行文件 , 可以在 Android 手机中 , 使用命令行执行 ;

手机必须 root 才可以执行 , 普通手机不能执行 ;

【Android NDK 开发】NDK 交叉编译 ( NDK 函数库目录 | Linux 交叉编译环境搭建 | 指定头文件目录 | 指定函数库目录 | 编译 Android 命令行可执行文件 )相关推荐

  1. Hi3516开发笔记(三):Hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/121458516 长期持续项目技术分享,Shang业Di ...

  2. Hi3516开发笔记(二):Hi3516虚拟机基础环境搭建之串口调试、网络连接以及sftp文件传输

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/121314575 长期持续项目技术分享,Shang业Di ...

  3. 第一节:linux 开发AI算法以及libtorch部署算法详细教程-环境搭建

    文章目录 linux 开发AI算法以及部署算法详细教程 linux docker环境搭建 参考example-docker libtorch 安装教程 opencv 安装教程 编译过程 测试开发环境示 ...

  4. Android NDK开发之一:NDK与JNI基础

    一.导读 在Android OS上开发应用程序,Google提供了两种开发包:SDK和NDK.你可以从Google官方查阅到有许多关于SDK的优秀书籍.文章作为参考,但是Google提供的NDK资源, ...

  5. Kivy Android开发教程之 开始构建 Kivy 跨平台应用程序(环境搭建含程序源码)

    本教程包含以下部分: 介绍 安装 Kivy 依赖项 创建安装 Kivy 的虚拟环境 安装 Cython 安装 Kivy 导入 Kivy 创建简单的 Kivy 应用程序 安装 Buildozer 创建 ...

  6. 《Android 网络开发与应用实战详解》——1.3节搭建Android应用开发环境

    本节书摘来自异步社区<Android 网络开发与应用实战详解>一书中的第1章,第1.3节搭建Android应用开发环境,作者 王东华,更多章节内容可以访问云栖社区"异步社区&qu ...

  7. linux top交叉编译_Linux 系统下ARM Linux交叉编译环境crosstool工具

    Linux系统下ARM Linux交叉编译环境的建立目前流行的有三种途径. 一.使用别人编译好的开发工具链本文引用地址:http://www.eepw.com.cn/article/201611/31 ...

  8. 干货|TensorFlow开发环境搭建(Ubuntu16.04+GPU+TensorFlow源码编译)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|机器学习算法工程师 安装平台 1 平台 目前Tensor ...

  9. 【OpenGL】八、初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗口设置为 OpenGL 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★

    文章目录 一.导入 OpenGL 的两个头文件 二.链接 OpenGL 库 三.将 Windows 桌面窗口改成 OpenGL 窗口 四.获取窗口设备 五.设置像素格式描述符 六.设置像素格式 七.创 ...

最新文章

  1. java面试时候算法题多吗_java程序员面试中最容易被问到的18个算法题(附答案!)...
  2. docker 命令详细解释
  3. css hack *html,CSS Hack详解
  4. python语言是谁发明的咋读-Python的发明,竟然是因为他不喜欢花括号。
  5. K8s之ControllerRateLimiter简单理解
  6. 互斥体CMutex的使用
  7. IOS基本数据类型之枚举
  8. python enumeration_python模块之enum_上
  9. 【PAT - 甲级1003】Emergency (25分)(Dijkstra,最短路条数,双权值最短路)
  10. python中的缩进是长度统一吗_python缩进长度是否统一
  11. 6678学习笔记开篇
  12. 银行卡收单之网络传输加密
  13. springboot+easypoi excel表格多个sheet导出
  14. 必备装机软件,软件推荐
  15. 框架的概念框架(Framework)
  16. 激活具有 eSIM 功能的消费类物联网设备的 4 种方法
  17. 天翼云盘突破限制无需客户端下载文件方法
  18. 【Microsoft Azure 的1024种玩法】六.使用Azure Cloud Shell对Linux VirtualMachines 进行生命周期管理...
  19. 【5G】协议与信令区别
  20. WordPress博客网站屏蔽搜索特殊关键字和网址,屏蔽恶意特殊关键词的方法分享,附如何屏蔽搜索收录

热门文章

  1. DeepStream开发日志
  2. OSI模型和TCP/IP模型
  3. mysql 日志文件mysql-bin文件清除方法,和mysql-bin相关文件的配置
  4. HttpUrlConnection get和post简单实现(疑惑解决)
  5. 理解统计信息(6/6):统计信息汇总贴
  6. puppet完全攻略(一)puppet应用原理及安装部署
  7. multipart/form-data ajax 提交问题(未解决)
  8. JQuery开发之Galleriffic图片插件介绍
  9. 怎么实现Web系统URL传输(表单提交)参数加密-zhuan
  10. 第二节 RabbitMQ配置