`

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

 
阅读更多

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

http://blog.csdn.net/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"是强制需要的。

分享到:
评论

相关推荐

    ubuntu下android ndk编译环境搭建详细描述

    在Ubuntu系统上搭建Android NDK编译环境是Android原生代码开发的重要步骤,适用于那些需要进行C/C++底层开发或优化的应用程序。Android NDK(Native Development Kit)是一套工具,允许开发者使用C/C++编写部分应用...

    使用Android NDK编译Android平台的eXosip库

    本文将深入探讨如何使用Android NDK(Native Development Kit)来编译适用于Android平台的eXosip库,包括静态库和动态库的构建过程。 首先,eXosip是基于OSI(Open Systems Interconnection)模型的SIP协议栈,它是...

    从Android NDK安装ARM交叉编译工具链

    熟练掌握NDK及其交叉编译工具链的安装和使用,对于从事Android底层开发和性能优化的工程师来说,是必备的技能之一。 文章最后提到了作者Wu Zhangjin,他是一位对Linux系统有着深厚兴趣的开发者和贡献者,自2004年起...

    android ndk下编译的live555源码(新版)

    总的来说,将Live555移植到Android平台是一个复杂的过程,需要深入理解Android NDK的工作原理,熟悉C/C++编程,以及具备一定的Android开发经验。完成移植后,你可以利用Live555的强大功能,开发出高效、稳定、功能...

    android-arm平台ndk交叉编译python

    这时,我们就需要用到Android NDK(Native Development Kit)进行交叉编译,将Python编译为适用于Android ARM架构的二进制代码。本文将详细讲解如何在Android ARM平台上使用NDK工具进行Python的交叉编译。 首先,...

    android使用NDK编译curl库源码

    在这个场景中,我们将探讨如何在Android环境下使用NDK(Native Development Kit)编译Curl库源码。 首先,NDK是Google提供的一个工具集,允许开发者在Android应用中集成原生代码。通过NDK,我们可以编写C和C++代码...

    Android NDK android-ndk-r22b 交叉编译x264 脚本

    1、支持arm 2、支持aarch64

    android-ndk(android-ndk-r23b-windows.zip)

    NDK是Android应用开发中的一个重要组成部分,它允许开发者使用原生代码(如C、C++)来编写部分应用程序,从而利用底层的硬件性能,提高程序运行效率,尤其是在处理图形计算、物理模拟和游戏引擎等高性能需求的场景下...

    live555 ndk 编译

    live555 库 和 testRtspClient.cpp 编译生成静态库 和 可执行文件 testRtspClient 编译方法: 首先进入各个模块执行 Makefile,将静态库拷贝至上层目录 执行 ndk-build

    android ndk环境下移植libiconv方法 附源码

    NDK(Native Development Kit)是Google提供的一个用于Android应用开发的工具集,允许开发者使用C和C++编写部分或全部应用程序,从而利用硬件的性能并提高程序的运行效率。 在Android NDK环境下移植`libiconv`,...

    soxr Android ndk编译demo

    **正文** 在移动开发领域,Android NDK是一个重要的工具,它允许开发者在...在实际开发中,根据项目的具体需求,可能还需要考虑优化、多线程支持、错误处理等更复杂的问题,但这已经足够开启你的Android NDK之旅了。

    android-ndk(android-ndk-r25b-windows.zip)

    在实际开发中,Android NDK通常与Java代码配合使用,Java负责应用程序的界面和逻辑,而NDK负责高性能的部分。结合使用Gradle插件,如CMake或ndk-build,可以方便地集成原生代码到Android Studio项目中。总的来说,...

    Android ndk Android.mk

    这个虽然只是个简单的jnidemo、但是涵盖了Android.mk 和Application.mk 的原理 重点是Android NDK编译的理解 mac 系统下 切换到jni目录,然后呢个 ndk-build

    用Android_NDK编译FFmpeg,RTSP手机视频

    ### 使用Android NDK编译FFmpeg与实现RTSP手机视频功能 #### 一、前言 随着移动设备处理能力的不断增强,越来越多的应用程序开始利用原生的C/C++代码来提高性能,尤其是在多媒体处理领域。FFmpeg是一款强大的跨平台...

    opus NDK 编译 Android.mk文件

    opus NDK 编译 Android.mk文件 仅供参考

    android-ndk(android-ndk-r25b-linux.zip)

    在Android中,JNI是Android应用与NDK之间的重要桥梁,使得Java应用程序可以调用C/C++编写的本地库,同时C/C++代码也能调用Java的方法。 2. **NDK的优势**: - **性能优化**:对于计算密集型任务,例如图形处理、...

    Android-NDK-clang 编译 FFmpeg 安卓设备能使用的FFmpeg库

    Ubuntu20系统,Android NDK-r21e 编译 FFmpeg4.2.4; 编译出libavcodec.so libavdevice.so、libavfilter.so、libavformat.so、libavutil.so、libswresample.so、libswscale.so;

    android-ndk(android-ndk-r25b-darwin.zip)

    `android-ndk-r25b-darwin.zip` 是针对macOS系统的NDK版本,版本号为r25b,包含了一系列用于构建、编译和调试原生代码的工具。 在Android应用开发中,NDK的主要作用和知识点包括: 1. **JNI (Java Native ...

Global site tag (gtag.js) - Google Analytics