(转)NDK Android程序编译原理之浅析

感谢原文作者的总结,地址如下:

http://blog.youkuaiyun.com/nodeathphoenix/article/details/7684230

 

Android build/core下的编译脚本里会用到变量NDK_ROOT和NDK_PROJECT_PATH。但是这两个变量你都不是必须显式地设置对应环境变量。因为如果没有定义NDK_ROOT,脚本里拿字符串"build/core"去匹配当前脚本的全路径,截取该字符串前面的部分即是NDK_ROOT了。如果定义了NDK_PROJECT_PATH,则脚本会在该路径下去找jni目录下的 application.mk 和 android.mk;如果没有定义NDK_PROJECT_PATH,则脚本会查找"jni/Android.mk"来匹配得到NDK_PROJECT_PATH,然后在NDK_PROJECT_PATH目录下找到application.mk 和 android.mk。如果application.mk中的APP_BUILD_SCRIPT没有指定Android.mk的路径,则在application.mk当前所在的目录下找Android.mk;否则的话,就直接根据APP_BUILD_SCRIPT来找Android.mk。

Android下面编译程序,除了Android.mk之外, Application.mk也是必须要的。 通过查看buid/core/build-local.mk可知道,如果你没有写Application.mk,它会默认地使用build/core/default-application.mk,然后根据其中的APP_BUILD_SCRIPT调用Android.mk去编译.所以,如果刚好你不需要在Application.mk中去指定cpu的架构等信息,没有写Application.mk你也能正确编译。

Application.mk 中的APP_BUILD_SCRIPT是个可选的变量,可以根据需要来决定是否设置具体的值。正因为这个特性,我们可以根据Application.mk的位置分为$Project/jni/ 和 $NDK_ROOT/jni/中两种情况。

如果没有指定环境变量NDK_PROJECT_PATH,编译器会在当前执行编译命令的目录下通过匹配jni/Android.mk的方式来得到NDK_PROJECT_PATH。所以执行的时候只能在$Project当前应用程序的目录下执行$NDK_ROOT/ndk-build来编译。

Application.mk可以和Android.mk一起放在你的$Project/jni/目录下,如果Application.mk中没有指定APP_BUILD_SCRIPT变量的值,编译器会自动在make的当前目录下的jni目录下去找Android.mk. 如果Application.mk中指定了APP_BUILD_SCRIPT变量的值,则编译器会按照此变量的值去读Android.mk.所以。一般对于Application.mk和Android.mk都在$Project/jni/目录下的情况,我们没有必要在Application.mk中指定APP_BUILD_SCRIPT,直接让编译器读取$Project/jni/目录下的Android.mk就可以了。

对于Application.mk在$NDK_ROOT/jni/下的情况,则必须要指定APP_BUILD_SCRIPT,APP_PROJECT_PATH也是可选的,同时必须要指定环境变量NDK_PROJECT_PATH---编译器根据此环境变量找到$NDK_ROOT/jni/Application.mk。

注意APP_PROJECT_PATH对于"$PROJECT/jni/Application.mk"文件是可选的,但对于"$NDK/apps/<myapp>/Application.mk"是强制需要的。

NDK是什么?有什么用?需要掌握什么技术栈? LLDB是一个高性能的调试器,它可以用于调试多种平台和语言,包括C / C ++,Objective-C,Swift和Assembly。需要注意的是,虽然使用 NDK 可以为应用程序带来更好的性能和更高的灵活性,但同时也增加了应用程序的开发和维护成本。有时候,拿到C/C++的代码会有各种各样的问题,例如代码是针对32系统编写的,我们要移植到64位系统运行可能就会出问题。很灵活和强大的构建工具,需要掌握CMake的使用,才能根据不同的源代码环境对代码进行正确的构建。这是掌握NDK必不可少的技术栈。 阅读详情

相关推荐

JS逆向-快手__NS_hxfalcon参数分析

现在快手H5接口都需要__NS_hxfalcon这个参数,这篇文章就是逆向这个参数

ckcookies的博客 4076

关于Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: Android.mk引发的思考

有一些老的JNI工程,进行编译的时候经常会遇到ndk版本不一致,或者编译器不合适的,各种报错,我这里各处一些简单实用的处理方法,希望能够帮助到正在进行JNI学习的小伙伴。将jni的部分,包含android.mk,Application.mk文件放在jni文件夹里面,保证文件显性课寻址,如果后续还是有报错,哪有是缺失文件或者名称路径错误之类的,我们可以加上日志打印,可以更加详细的定位问题,分析原因。这样我们就可以根据日志打印中给我们的提示,进行原因分析,定位问题,一一进行改正。............

hnjzfwy的博客 1769

泛微OA与金蝶云星空深度集成实战:审批与表单双场景解析

本文深入解析泛微OA与金蝶云星空的深度集成实战,聚焦审批流程与表单对接两大核心场景。通过具体案例,详细阐述了如何实现业务数据与审批流程的自动联动,打破数据孤岛,提升企业运营效率与数据一致性,并分享了接口设计、安全策略及实战避坑指南。

4k5l6j7h8的博客 466

Android程序编译原理之浅析

Android build/core下的编译脚本里会用到变量NDK_ROOT和NDK_PROJECT_PATH。但是这两个变量你都不是必须显式地设置对应环境变量。因为如果没有定义NDK_ROOT,脚本里拿字符串"build/core"去匹配当前脚本的全路径,截取该字符串前面的部分即是NDK_ROOT了。如果定义了NDK_PROJECT_PATH,则脚本会在该路径下去找jni目录下的 applica

nodeathphoenix的专栏 1万+

DRM驱动架构浅析-上(DRM基础概要与U-Boot阶段驱动解析)

本文主要探讨了Rockchip平台的DRM显示驱动架构及其在U-Boot阶段的实现。

一路寒风身如絮,命海沉浮客独行 1766

pynq-z2 HLS开发

定制Overlay一.用HLS生成一个定制IP功啊啊是合理的创建标题,有助于目录的生成如何改变是式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 一.用HLS生成一个定制IP ...

qq_38769280的博客 4156

Android C/C++开发指南

AndroidC/C++开发指南 1.AndroidC/C++简介 众所周知,Android作为目前主流的移动终端领域的开发平台,其主要的开发语言就是JAVA。Android借助于JAVA高效、灵活的开发模式,迅速占领了移动互联网开发的半壁江山。基于JDK和Android实现的各种JAVA框架,开发人员可以快速实现各种功能的APP,而且APP的安装和升级维护都实现的方便。 对于,Andr

飞翔de刺猬 1万+

ARM Linux工控板+C# .NET Core:倍福ADS协议轻量化工业控制(附跨平台部署代码)

某自动化设备厂的倍福PLC控制系统曾依赖传统x86工控机:单台设备需配备1台Intel i5工控机(成本约8000元),功耗30W+,且Windows系统稳定性受工业环境干扰(如电磁辐射导致蓝屏)。更棘手的是,设备需部署在产线边缘(空间狭小),x86工控机的体积(4U机架)和散热需求(风扇噪音)难以适配;而多设备部署时,高硬件成本和高功耗导致年运维成本超20万元。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 954

android 未知文件打开,您的APP_BUILD_SCRIPT指向一个未知文件:./ jni / Android.mk

我想让ndk-gdb工作,但我有一些问题.我的项目结构是这样的:trunk--indiana (Here is the android_manifest)--ubravo_java----mbravo (here is the native code)------jni (here are the Android.mk and Application.mk)问题1:我知道我可能必须从清单所在的目...

weixin_42511121的博客 443

第一部分:VTK基础入门(第1章:VTK简介与概述)

VTK简介与核心特性概述 VTK(Visualization Toolkit)是一个开源的跨平台C++类库,专用于3D计算机图形学、图像处理和科学可视化。由Kitware公司开发,VTK自1993年起源以来,经历了开源化、成熟化和现代化多个发展阶段,现已成为科学可视化的核心工具之一。 VTK的核心特性包括: 管道架构:模块化设计实现数据流管理 丰富的数据支持:处理多边形数据、图像数据等 强大的渲染能力:集成OpenGL,支持多种渲染技术 最新版本VTK 9.4.2增强了现代C++支持,优化了内存管理,并提升

仰望星空的博客 2362

Gromacs 模拟昆虫 P450 解毒酶与农药结合完整指南,仅供参考!

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1241

Android NDK 编译原理

一、gradle gradle是Android Studio指定的自动编译脚本,它有点像 Linux C开发中的 Makefile。下面我来看下 Android Studio 是如何使用 Gradle 的。 在 Android 项目中,包括三个 gradle 文件, 它分分别是: build.gradle是Android 项目的顶级脚本; setting.gradle里记录了 Android 项目里都包括了哪些子项目; app/build.gradle里记录了每个子模块应该如何进行编译。 下.

Just for fun的专栏 954

OpenMVS :用 colmap制作自己的数据集 重建(用colmap计算位姿,将位姿转为MVS需要的格式)

数据集制作主要是在windows进行,比较方便。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 3326

使用安卓NDK 交叉编译动态库、静态库基础入门

本篇博客将详细介绍如何在 Windows 环境下使用 Android NDK 交叉编译 C 文件,生成静态和动态库,并在 Android 项目中使用这些库。编译器概述特点GNU项目开发的编译器集合,支持多种编程语言,包括C、C++、Fortran等。开源免费:遵循GPL许可,广泛应用于开源项目。跨平台支持:支持Linux、Windows、macOS等多种操作系统和硬件架构。强大的优化能力:提供多种优化选项,生成高效的目标代码。G++GCC中的C++编译器驱动程序,专门用于编译C++源代码。

WriteBug001的博客 2309

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Android NDK编译原理

前言 做Android APP开发,可以基本不用care java的编译过程,java的依赖关系,并且现在Android studio也已经支持了cmake开发,也就是说大部分情况下,就不用关心系统是如何编译的,不过对于想要用以一些第三方库,这就需要对整个编译框架有所了解了,并且这个东东还是很简单的。 正文 Android APP jni 编译控制有四种主要的编译控制系统, Andr...

白嫩豆腐 1377

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

NDK开发之编译原理与语法

1.编译流程 编译就是将高级语言的代码转化成可执行的二进制目标代码。主要包含四个步骤:预处理、编译、汇编、链接。 预处理:就是对各种预处理命令的处理,主要是宏替换、文件引入、去除空行和注释等。linux系统中预处理命令:gcc -E test.c -o test.i。-E表示gcc在预处理后停止编译、汇编和链接操作。 编译:将预处理后的代码翻译成汇编语言。会先分析后综合,分析就是进行词法、语...

awsaawsy的博客 653

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Awesome-Android-NDK 安装与配置指南

Awesome-Android-NDK 安装与配置指南 一、项目基础介绍 Awesome-Android-NDK 是一个开源项目,旨在帮助 Android 开发者深入理解并掌握 NDK(Native Development Kit)技术。NDK 是一套工具,允许开发者在 Android 应用中使用 C 和 C++ 代码,以便于实现高性能的应用功能。项目涵盖了从基础知识到高级应用的多个方面,包括 C...

gitblog_00242的博客 886

从源码到APK:FFmpeg-Android的编译原理与自定义构建指南

FFmpeg-Android是一个为Android平台预编译FFmpeg和FFprobe的开源项目,让开发者能够在Android应用中轻松执行多媒体处理命令。本文将深入解析FFmpeg-Android的编译原理,并提供完整的自定义构建指南,帮助您从源码到APK的完整流程。 ## 🔍 FFmpeg-Android项目架构解析 FFmpeg-Android项目采用模块化设计,主要包含两个核心模块

gitblog_00202的博客 499

Awesome-Android-NDK 使用教程

Awesome-Android-NDK 使用教程 一、项目目录结构及介绍 Awesome-Android-NDK 项目旨在全面深入地掌握NDK技术,该项目目录结构清晰,内容丰富,主要包括以下几个部分: README.md:项目的主 README 文件,概述了项目的内容和目的。 LICENSE:项目的许可证文件,本项目采用 Apache-2.0 许可。 ScreensShots:存放项目相关的屏...

gitblog_00241的博客 779

从0构建StrykerOSS:Android Gradle + ndk-build编译指南与Release签名配置清单

StrykerOSS(Stryker)是一款免费的开源 Android 移动渗透测试工具集,将 Nmap、Metasploit、Nuclei、Hydra 等安全工具整合进一个需要 Root 的 Android 应用中,并内置终端直接运行 chroot 环境。本文带你用 Android Gradle + ndk-build 从 0 到 1 编译出 APK,并给出完整的 Release 签名配置清单,

gitblog_00742的博客 432

Android NDK 原理

本文介绍Android NDK 原理, 熟悉此教程, 需要有JNI的基础, 以及Android 应用程序的入门知识(环境搭建, 工程运行等), 可以查看本站的其它文章. 本文关注Android NDK的原理知识. 关于JNI的基本原理, 请参考: cygwin + gcc+makeFile入门(三): JNI的编译 NDK的基本上可以分解成以下步骤: 1. 搭建编译环境...

yaasshole 119

终极指南:如何在Android手机上实现C++原生开发?Termux-NDK完整解决方案

你是否曾想过,能否在Android手机上直接进行C/C++原生开发,摆脱笨重的PC环境限制?传统Android NDK开发需要复杂的桌面环境配置,但Termux-NDK项目彻底改变了这一现状。这个开源工具将完整的Android NDK工具链移植到Termux环境中,让你能够在移动设备上轻松编译和调试原生代码,开启移动原生开发的新时代。 ## 传统开发痛点 vs Termux-NDK解决方案 #

gitblog_00494的博客 431

RKNPU2 Android部署实战:YOLOv5 APK Demo从NDK编译到打包运行一次讲清

本文带你用 RKNPU2(瑞芯微 RKNN 运行时库)在 RK3566/RK3568、RK3562、RK3588 平台上完成一次完整的 **YOLOv5 目标检测 Android APK 部署**:从用 Android Studio + NDK 编译 C++ 推理代码,到把 .rknn 模型打进 APK,再到真机运行并修复两个最常见的编译报错。全程基于官方示例 [rknn_yolov5_andro

gitblog_00536的博客 953
上一篇: Gradle build is stricter that Eclipse ADT (e.g. Found item _ more than one time)
下一篇: (转)proguard 原理
jameskaron
博客等级 码龄20年 31粉丝 663原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值