当前位置:首页 > 编程开发

Android NDK开发指南(二)Android.mk文件

webgou13年前 (2014-05-23)编程开发288

Android.mk文件语法详述

1.  概述

      Android.mk文件是用来描述build system(编译系统)的,更准确的说:该文件是一个微型的GNU Makefile片段,将由build system解析一次或者多次。

这个文件的目的是用来允许你将源文件组织成模块,这个模块中含有:一个静态库(.a文件)  或 一个动态库(.so文件)
只有动态库才会被安装/复制到你的应用程序包,尽管静态库可以被用来生成动态库。

       你可以在每个模块中  都定义一个Android.mk文件,你也可以让多个模块共用一个Android.mk文件。build system可以为你处理许多细节,

例如:你不需要在Android.mk文件中列出头文件或者其他的依赖关系,这些NDK的build system会自动为你计算并处理。

这也意味着,当更新到新版本的NDK的时候,你应该得益于新的toolchain/platform的支持,而无需修改你的Android.mk文件。

( 注意:这些语法非常接近于分布在完整的开源的Android源代码中的Android.mk文件,尽管是build system实现的,但是它们的用法是不同的。

这样故意设计的决定是为了让应用程序开发者重用“外部”库的源代码更容易。)

 

2.  实例分析

‘jni/Android.mk’ 文件描述了如何生成一个共享库,它的内容是:
-----------------Android.mk------------------------
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

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

include $(BUILD_SHARED_LIBRARY)
---------------------------------------------------

  (1).  LOCAL_PATH:=$(call my-dir)         ----------必须
           Android.mk文件必须以LOCAL_PATH变量开始,它用于在树中定位文件。

           宏功能'my-dir'是由build system提供的,用于返回当前目录路径(包括Android.mk文件本身)

 

  (2).  include $(CLEAR_VARS)                     ----------必须
         CLEAR_VARS变量是由build system提供的,并且指明了一个GNU makefile文件,这个功能会清理掉所有以LOCAL_开头的内容(例如

          LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES等),除了LOCAL_PATH,这句话是必须的,

          因为如果所有的变量都是全局变量的话,所有的可控的编译文件都需要在一个单独的GNU中被解析并执行

 

  (3).  LOCAL_MODULE :=hello-jni
         LOCAL_MODULE变量必须被定义,用来区分Android.mk中的每一个模块。文件名必须是唯一的,不能有空格。

         注意,这里编译器会为你自动加上一些前缀和后缀,来保证文件是一致的,

          比如:这里表明一个动态连接库模块被命名为"hello-jni",但是最后会生成为"libhello-jni.so"文件。

          但是在Java中装载这个库的时候还是使用"hello-jni"名称。当然如果我们使用"IMPORTANT NOTE:" 编译系统就不会为你加上前缀

          但是为了支持Android平台源码中的Android.mk文件,也同样会生成libhello-jni.so这样的文件。

          如果你将你的模块命名为'libfoo',编译系统将不会将前缀'lib'加上去,并且也会生成libfoo.so文件。

 

  (4).  LOCAL_SRC_FILES := hello-jni.c
             LOCAL_SRC_FILES变量被需包括一个C和C++源文件的列表,这些会编译并聚合到一个模块中。
             注意:这里并不需要你列出头文件和被包含的文件,因为编译系统会自动为你计算相关的属性,源代码中的列表会直接传递给编译器。
             C++默认文件的扩展名是“.cpp”,我们可以通过定义一个LOCAL_DEFAULT_CPP_EXTENSION变量来定义一个不同的C文件。

              不要忘记在初始化前面的“.”点(也就是说".cpp"可以正常工作,但是cpp不能正常工作)

 

  (5). include $(BUILD_SHARED_LIBRARY)
           BUILD_SHARED_LIBRARY这个变量是由系统提供的,并且指定给GNU Makefile的脚本,

           它可以收集所有你定义的"include $(CLEAR_VARS)"中以LOCAL_开头的变量,并且决定哪些要被编译,哪些应该做的更加准确。

           编译生成的是以"lib<module_name>.so"的文件,这个就是共享库了。

           我们同样也可以使用BUILD_STATIC_LIBRARY编译系统便会生成一个以"lib<module_name>.a"的文件来供动态库调用。

 

扫描二维码推送至手机访问。

版权声明:本文由知了博客发布,如需转载请注明出处。

本文链接:https://www.webgou.info/?id=580

分享给朋友:

“Android NDK开发指南(二)Android.mk文件” 的相关文章

mysql修改字段

修改     ALTER   TABLE   TableName   CHANGE   Field_name_tobe_change   new_Name &n…

const常类型说明

常变量: const 类型说明符 变量名 常引用: const 类型说明符 &引用名 常对象: 类名 const 对象名 常成员函数: 类名::fun(形参) const 常数组: 类型说明符 const 数组名[大小] 常指针: cons…

理解EnterCriticalSection 临界区

保证只有一个线程访问一段代码…

codex安装教程

OpenAI Codex 是 OpenAI 推出的 AI 编程助手,支持桌面端和命令行(CLI)两种使用方式。以下是详细的安装与配置教程。桌面端安装(适合新手与日常使用)桌面端操作最直观,适合不想折腾命令行的用户。访问官网:打开 OpenAI Codex 官网,页面会自动识别你的系统。下载安装包:点…

ServerSocketChannel

http://diary.51.com/diary/diary_add.php?groupid=103706呵呵,我来告诉你吧,至于例子代码在我的回答记录中有。你自己翻来去看,是用nio给一个学生写的BBS聊天室。在用nio通讯的过程我用以下情景给你模拟: 1. 学校(ServerSocketCha…

c++操作符重载

c++有许多内置数据类型,包括int,char,double, 第一种类型有许多运算符,比如,+ - * /.当用户定义了许多类对象时,对像间是不能进行这些操作的.但c++类允许把这些运算符内置到c++类中,可以像操作内置对象一样操作.…

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。