`
Jack22
  • 浏览: 133009 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android ndk 之Android.mk编写

 
阅读更多

转载:http://aswang.iteye.com/blog/1036130

最近在移植一个linux下的c库到android,学习编写Android.mk文件,特地花了点时间学习。

 

在网上搜了很多,最后发现还是看ndk的文档最直接,也最全面,下面的总结主要是根据ndk提供的文档编写的。

 

1、单一的Android.mk文件:

 

   LOCAL_PATH := $(call my-dir)

   include $(CLEAR_VARS)

   LOCAL_MODULE    := hello-jni
   LOCAL_SRC_FILES := hello-jni.c

   include $(BUILD_SHARED_LIBRARY)

 

LOCAL_PATH必须位于Android.mk文件的最开始。它是用来定位源文件的位置,$(call my-dir)的作用就是返回当前目录的路径。

 

include $(CLEAR_VARS)的作用是清除一些变量的值,但是LOCAL_PATH除外。

 

LOCAL_MODULE是用来指定当前待编译模块的名称,在示例中的模块名称为hello-jni

 

LOCAL_SRC_FILES是用来指定参与编译的源代码文件。这里只编译hell0-jin.c

 

include $(BUILD_SHARED_LIBRARY)是用来指示将当前模块编译为共享库,前缀为lib,后缀为.so。

还有另外一个BUILD_STATIC_LIBRARY,是用来指示将当前模块编译为静态库的,前缀为.a,后缀为.a。

 

这就是一个最简单的Android.mk的结构。可能还有另外一点需要介绍:

LOCAL_C_INCLUDES:=include 这个是用来指定在编译时即将使用的c头文件的位置,以当前目录为起点。

 

2、定义多个Android.mk文件。

有的时候,需要编译的模块比较多,我们可能会将对应的模块放置在相应的目录中,这样,我们可以在每个目录中定义对应的Android.mk文件(类似于上面的写法),最后,在根目录放置一个Android.mk文件,内容如下:

 

include $(call all-subdir-makefiles)

 

只需要这一行就可以了,它的作用就是包含所有子目录中的Android.mk文件

 

3、也可以在一个Android.mk文件里包含多个模块。

很直观的想法就是将第一个Android.mk文件的内容复制一份,然后修改。我最开始也是这样做的,但是后来出现问题了,在第二个模块中的源码找不到,最后还是看文档,发现里面已经有示例解释了:

 

 LOCAL_PATH := $(call my-dir)

 

 

IMPORTANT NOTE: Due to the way GNU Make works, this really returns
    the path of the *last* *included* *Makefile* during the parsing of
    build scripts. Do not call my-dir after including another file.

 

大意是:基于GNU make的工作方式,$(call my-dir)会返回在解析build脚本时,遇到的最后一个 include中涉及的目录。

 

所以,很多时候,在这个Android.mk里面只需要调用一次$(call my-dir)就够了,如果所有的源文件都在一个目录中。

 

如果需要的话,可以在第一次调用call my-dir的时候,将值保存下来,比如:

 

MY_LOCAL_PATH := $(call my-dir)

 

 

LOCAL_PATH := $(MY_LOCAL_PATH)

 

然后,在另外一个模块中,继续如下定义:

 

LOCAL_PATH := $(MY_LOCAL_PATH)

 

 

 

在编译一般的c源代码时,上面的基本可以满足了,等后面需要,再继续补充吧!

 

 

补充:

关于LOCAL_CFLAGS

在某些时候,编译源码需要定义宏变量,这个时候,我们可以直接在对应的源码里面去修改,但也有一些情况,我们是没法在别人的源码里定义宏变量的,这个时候,就需要使用到LOCAL_CFLAGS 了 ,举例如下:

 

LOCAL_CFLAGS  += -D__FAVOR_BSD

 

这行代码的作用就是在原有的cflags基础上,再定义一个宏变量__FAVOR_BSD

 

类似于#define __FAVOR_BSD

分享到:
评论

相关推荐

    Android NDK开发指南-android.mk文件

    Android NDK 是 Android 操作系统中的一种开发工具,用于使用 C/C++ 语言编写 Android 应用程序。Android.mk 文件是 NDK 中的一个重要组件,用于描述编译系统的配置,使得开发者可以轻松地将 C/C++ 代码编译成 ...

    生成android.mk文件

    `android.mk`文件是Android原生构建系统(NDK)中用于定义模块构建规则的脚本,主要用于C/C++原生库的编译。本篇文章将深入探讨`android.mk`文件的生成及其作用。 **1. android.mk文件简介** `android.mk`文件是...

    androidmk 转换Android.bp工具方法

    本篇文章将详细介绍如何进行`androidmk`到`Android.bp`的转换,并探讨两者之间的差异以及转换工具的使用方法。 一、`Android.mk`与`Android.bp`概述 1. `Android.mk`:这是Android早期使用的构建系统,基于GNU ...

    android-sdk-NDK16.1.4479499.rar

    Android SDK NDK是Android开发中的一个重要工具,全称为Android Software Development Kit Native Development Kit。NDK允许开发者使用C和C++语言编写部分应用代码,以提高性能或利用特定硬件功能。在标题"android-...

    ffmpeg移植android需要的android.mk

    1. **Android NDK**:FFmpeg是用C/C++编写的,Android原生应用主要使用Java编写,但为了利用FFmpeg,我们需要使用Android Native Development Kit (NDK)。NDK允许开发者在Android上编写和编译C/C++代码,将其与Java...

    Android NDK开发轻松入门.pdf

    **Android NDK**(Native Development Kit)是 Android SDK 的一个重要组成部分,它为开发者提供了使用 C 或 C++ 编写应用程序的功能,使开发者能够利用高性能的本地代码来优化应用性能。 - **目标**:通过 NDK,...

    android ndk application.mk

    本篇文章将深入探讨如何使用`application.mk`文件进行NDK编译,以及与之对比的CMake构建系统。 `application.mk`是Android NDK中的一种传统构建系统,它主要用于定义编译参数、链接器选项、依赖库等。这个文件是`...

    android-ndk-r8dab.zip_NDK_android_android ndk

    Android NDK(Native Development Kit)是Google为Android平台提供的一款用于开发原生代码的应用工具,它允许开发者使用C和C++编写部分应用代码,以利用设备的硬件性能或实现更底层的操作。在“android-ndk-r8dab....

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

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

    android编译系统makefile(Android.mk)写法

    在Android开发中,构建系统是至关重要的,它负责编译、链接和打包应用程序或系统组件。其中,`Android.mk`文件是Android构建...正确编写`Android.mk`文件,对于确保C/C++代码在Android平台上的正确编译和运行至关重要。

    Android.mk文件语法规范

    对于C/C++项目,Android.mk是NDK(Native Development Kit)的一部分,它允许开发者编写原生代码并与Java代码交互。通过设置LOCAL_C_INCLUDES添加头文件路径,LOCAL_LDLIBS添加链接库,以及LOCAL_ARM_MODE等控制ARM...

    Android.mk生成工具

    在Android开发领域,Android.mk和Application.mk是两个重要的构建文件,它们主要用于Android Native Development Kit (NDK)编译过程。这两个文件定义了如何构建和链接C/C++原生代码,以便在Android设备上运行。本篇...

    com.android.ide.eclipse.ndk_23

    Android Native Development Kit (NDK) 是Google为Android开发者提供的一款工具集,允许开发人员使用C和C++原生代码编写部分或全部应用。在某些情况下,NDK可以提高性能,尤其是处理密集型计算或者利用硬件加速功能...

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

    在Android应用开发中,NDK扮演着至关重要的角色,它允许开发者使用原生代码(如C和C++)来编写部分应用,以提高性能、利用硬件加速功能或复用现有的C/C++库。 1. **JNI(Java Native Interface)**: JNI是Java...

    Android.mk文件语法规范及使用模板.pdf

    在编写`Android.mk`文件时,首先需要设置局部环境变量。这通常包括设置`LOCAL_PATH`变量,该变量用于指定包含`Android.mk`文件的目录路径。例如: ```makefile LOCAL_PATH := $(call my-dir) ``` `my-dir`是...

    Android.mk编译内置无源码apk

    总结来说,编译内置无源码的APK涉及的主要步骤包括:创建目标目录,放置APK文件,编写`Android.mk`文件来定义编译规则,然后通过Android构建系统将APK集成到系统镜像中。这是一项关键的系统定制工作,对于开发者来说...

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

    3. **构建配置**:创建一个Android.mk或CMakeLists.txt文件,这是Android NDK的构建脚本。在其中指定源代码路径、编译选项、库依赖等。例如,你可能需要包含`src`目录,并链接到必要的系统库如`log`、`dl`等。 4. *...

    Android.mk之语法规范

    ### Android.mk语法规范详解 #### 序言 在深入了解Android.mk文件的语法规范之前,我们需要先了解Android.mk文件的基本...此外,理解和掌握Android.mk文件的编写技巧也是深入学习Android NDK开发不可或缺的一部分。

    android.mk文件介绍

    3. **宏(Macro)**:提供预定义的功能,简化`Android.mk`文件的编写。 #### 三、基础结构 一个典型的`Android.mk`文件包含以下部分: - **设置当前目录**:使用`LOCAL_PATH := $(call my-dir)`来获取当前文件...

Global site tag (gtag.js) - Google Analytics