`
Jack22
  • 浏览: 130918 次
  • 性别: 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.mk文件中文版

    一句一句翻译的NDK Android.mk帮助文档,帮助英语比我还差的哥们熟悉NDK的makefile的编写方法。个人觉得翻译的还算比较准确,因为基本上也都是测试过的,是根据实践参考文档翻译得来。可能是目前为止翻译的最通顺...

    Android NDK开发JNI及mk

    这是Android NDK开发标准的JNI和Android.mk编写模版,里面的一些东西可能涉及我的项目,但不影响观看

    android开发实践之ndk编译命令简单示例

    Android提供了NDK工具,用来编译native代码(c/c++),该工具配置好了相关的交叉编译环境和工具链,只需要你简单地编写几个.mk文件即可将你的c/c++代码编译为Android的java工程/Android手机可以识别、加载和运行的库...

    Android-使用NDK和JNI调整图片的亮度和对比度类似QQ离线头像显示灰使用mk编写脚本

    使用NDK和JNI调整图片的亮度和对比度,类似QQ离线头像显示灰,使用mk编写脚本

    Android应用开发揭秘pdf高清版

    内容提要 ------------------------------------------...16.4 AndroidNDK中使用0penGL 16.5小结 第17章 Android脚本环境 17.1 Android脚本环境简介 17.2 Android脚本环境安装 17.3如何编写Android脚本程序 17.4小结

    Android 串口 文件描述符

    使用Java的FileDescriptor来操作串口。 ①编写Java文件 ②使用javac将.java编译成.class文件,然后使用javah编译相应的头文件 ③实现相关的.c/.cpp文件...④编写Android.mk和Aplication.mk文件 ⑤利用ndk编译so库。

    android_build

    我们的 Android.mk 文件看起来很相似,但与 NDK 构建系统使用的 Android.mk 文件完全不同。 在别处搜索文档时,请确保它是针对平台构建系统的——大多数不是。 这个基于 Makefile 的系统正在被取代,这是一个用 Go...

    ccv_android:CCV + Android + NDK,可移植的CCV到android

    我复制了CCV的源代码,构建了一个包含此类源代码的新JNI项目,编写了新的Android.mk以在Android中构建。 最重要的是,在Android下构建起来并不容易。 我们应该使用NDK-build而不是某些PC工具(例如GNU-gcc或...

    Android使用jni调用c++/c方法详解

    JniTest是在Android.mk里约束好的,关于Android.mk的编写具体在后面详解。 3、使用javah -jni生成.h文件 编写好jni加载类之后,就要开始生成.h文件了,此文件相当于一个声明文件,起到jni连接c++源

    建造

    有关对Android.mk编写者有用的行为更改列表,请参见 有关Android.mk文件的过时参考,请参阅 。 我们的Android.mk文件看起来相似,但与NDK构建系统使用的Android.mk文件完全不同。 在其他地方搜索文档时,请确保它...

    build

    有关如何运行构建的文档,请参见 有关对Android.mk编写者有用的行为更改列表,请参见 有关Android.mk文件的过时参考,请参阅 。 我们的Android.mk文件看起来相似,但与NDK构建系统使用的Android.mk文件完全不同。 ...

    platform_build

    有关对Android.mk编写者有用的行为更改列表,请参见 有关Android.mk文件的过时参考,请参阅 。 我们的Android.mk文件看起来相似,但与NDK构建系统使用的Android.mk文件完全不同。 在其他地方搜索文档时,请确保它...

Global site tag (gtag.js) - Google Analytics