【金沙js777】Android.mk语法深入分析

实际的编写翻译变量列举:

LOCAL_MODULE模块必得定义,以代表Android.mk中的每多个模块。名字必须唯大器晚成且不带有空格。

Android.mk详解

如果您将模块命名为“libfoo”,则生成系统不会添加另一个“lib”前缀,也会生成libfoo.so。

当前Makefile的路径。

3.2. GNU Make系统变量

  那几个 GNU Make变量在您的 Android.mk 文件深入分析早先,就由编写翻译系统定义好了。注意在

一点意况下,NDK或者剖析 Android.mk 四回,每三遍有个别变量的概念会有两样。

  (1)CLEAR_VAPRADOS:  指向一个编写翻译脚本,大约具备未定义的 LOCAL_XXX 变量都在"Module-description"节中列出。必需在开端二个新模块在此以前包涵那几个本子:include$(CLEA科雷傲_VARAV4S卡塔尔(قطر‎,用于重置除LOCAL_PATH变量外的,全体LOCAL_XXX类别变量。

  (2)BUILD_SHARED_LIBRATucsonY:  指向编写翻译脚本,依照全数的在 LOCAL_XXX 变量把列出的源代码文件编译成叁个分享库。

  注意,必得起码在蕴藏这么些文件此前定义 LOCAL_MODULE 和 LOCAL_SRC_FILES。

(3) BUILD_STATIC_LIBRARY:  一个 BUILD_SHARED_LIBRA路虎极光Y 变量用于编译四个静态库。静态库不会复制到的APK包中,可是能够用于编译分享库。

示例:include $(BUILD_STATIC_LIBRARY) 

小心,那将会变卦多少个名称为 lib$(LOCAL_MODULE).a 的文件

  (4)TARGET_ARCH: 指标 CPU平台的名字,  和 android 开放源码中钦定的那么。倘诺是arm,表示要生成 ARM 宽容的指令,与 CPU结构的修改装订版毫无干系。

  (5)TARGET_PLATFORM: Android.mk 拆解解析的时候,指标 Android 平台的名字.实际情况可参看/development/ndk/docs/stable- apis.txt.

 android-3 -> Official Android 1.5 system images

 android-4 -> Official Android 1.6 system images

 android-5 -> Official Android 2.0 system images

  (6)TARGET_ARCH_ABI:  临时只辅助多个 value,armeabi 和 armeabi-v7a。在目前的本子中日常把那七个值轻便的概念为 arm, 通过 android  平桃园间对它重定义来博取越来越好的特别。其余的 ABI 将在这里后的 NDK 版本中介绍,它们会有例外的名字。注意纵然富有基于ARM的ABI都会把 'TALacrosseGET_ARCH'定义成‘arm’, 但是会有不一样的‘TA奥迪Q5GET_ARCH_ABI’。 

( 7 ) TARGET_ABI:  指标平台和 ABI 的组成,它实际上被定义成$(TA奔驰G级GET_PLATFORM)-$(TARGET_ARCH_ABI卡塔尔国  ,在想要在看名就能猜到其意义的设备中针对贰个特地的目的体系开展测量检验时,会有用。在暗许的场馆下,它会是'android-3-arm'。

 LOCAL_MODULE := hello-jni

2.1.4: BUILD_EXECUTABLE:

3.5. Android.mk 使用模板

  在三个 Android.mk 中得以生成多少个APK应用程序,JAVA库,C\C++可试行顺序,C\C++动态库和C\C++静态库。

(1)编写翻译APK应用程序模板。

至于编写翻译APK应用程序的模板请参谋《Android.mk编写翻译APK楷模》

(2)编译JAVA库模板

  LOCAL_PATH := $(call my-dir)

  include $(CLEAR_VARS)

  # Build all java files in the java subdirectory

  LOCAL_SRC_FILES := $(call all-subdir-java-files)

  # Any libraries that this library depends on

  LOCAL_JAVA_LIBRARIES := android.test.runner

  # The name of the jar file to create

  LOCAL_MODULE := sample

  # Build a static jar file.

  include $(BUILD_STATIC_JAVA_LIBRARY)

  注:LOCAL_JAVA_LIBRAGL450IES := android.test.runner表示生成的JAVA库的jar文件名

(3)编译C/C++应用程序模板如下:

LOCAL_PATH := $(call my-dir)

#include $(CLEAR_VARS)

LOCAL_SRC_FILES := main.c

LOCAL_MODULE := test_exe

#LOCAL_C_INCLUDES :=

#LOCAL_STATIC_LIBRARIES :=

#LOCAL_SHARED_LIBRARIES :=

include $(BUILD_EXECUTABLE)

注:‘:=’是赋值的情趣,'+='是扩充的野趣,‘$’表示援用某变量的值

LOCAL_SRC_FILES中投入源文件路线,LOCAL_C_INCLUDES中步入必要的头文件搜索路线

LOCAL_STATIC_LIBRALX570IES 加入所急需链接的静态库(*.a)的名称,

LOCAL_SHARED_LIBRAEnclaveIES 中投入所须求链接的动态库(*.so)的名称,

LOCAL_MODULE表示模块最终的称谓,BUILD_EXECUTABLE 代表以一个可执路程序的办法打开编写翻译。

(4)编译C\C++静态库

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := \

 helloworld.c

LOCAL_MODULE:= libtest_static

 #LOCAL_C_INCLUDES :=

#LOCAL_STATIC_LIBRARIES :=

#LOCAL_SHARED_LIBRARIES :=

include $(BUILD_STATIC_LIBRARY)

和上边相像,BUILD_STATIC_LIBRAEscortY 表示编译二个静态库。

(5)编译C\C++动态库的模板

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := helloworld.c

LOCAL_MODULE := libtest_shared

TARGET_PRELINK_MODULES := false

#LOCAL_C_INCLUDES :=

#LOCAL_STATIC_LIBRARIES :=

#LOCAL_SHARED_LIBRARIES :=

include $(BUILD_SHARED_LIBRARY)

和地点相同,BUILD_SHARED_LIBRAHighlanderY 代表编写翻译叁个分享库。

如上三者的变动结果个别在如下目录中,generic 依具体 target 会变:

out/target/product/generic/obj/APPS

out/target/product/generic/obj/JAVA_LIBRARIES

out/target/product/generic/obj/EXECUTABLE

out/target/product/generic/obj/STATIC_LIBRARY

out/target/product/generic/obj/SHARED_LIBRARY

各类模块的靶子文件夹分别为:

1)APK程序:XXX_intermediates

2)JAVA库程序:XXX_intermediates

这里的XXX

 3)C\C++可试行顺序:XXX_intermediates

 4)C\C++静态库: XXX_static_intermediates

 5)C\C++动态库: XXX_shared_intermediates

 

假设想要定义自身在Android.mk中使用的变量名,建议增添MY_前缀。

LOCAL_CPP_FEATURES := exceptions

2. Android.mk示例

 

  能够在每个Android.mk file 中定义一个或八个模块,你也得以在多少个模块中动用同三个源代码文件。  编写翻译系统为您管理好多细节难点。举个例子,你无需在您的 Android.mk 中列出头文件和依赖文件。编译系统将会为您活动管理那几个主题材料。那也意味着,在进级 NDK 后,你应有得到新的toolchain/platform接济,而且不需求修正你的 Android.mk 文件。

  注意,NDK的Anroid.mk语法同公开发布的Android平台开源代码的Anroid.mk语法很临近,然则编译系统达成他们的

方式却是区别的,那是故意这样设计的,能够让程序开采职员重用外界库的源代码更易于。

  在描述语法细节在此以前,我们来看四个简便的"hello world"的例子,举个例子,下边包车型大巴文本:

 sources/helloworld/helloworld.c

 sources/helloworld/Android.mk

 'helloworld.c'是贰个 JNI 分享库,实现重返"hello world"字符串的原生方法。相应的

Android.mk 文件会象上边那样:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE:= helloworld

LOCAL_SRC_FILES := helloworld.c

include $(BUILD_SHARED_LIBRARY)

  解释一下几行代码:

  LOCAL_PATH := $(call my-dir)

  三个Android.mk file首先必需定义好LOCAL_PATH变量。它象征是时下文件的路径。

在这里个例子中, 宏函数‘my-dir’,  由编译系统提供, 用于再次回到当前路径(即蕴含Android.mk file文件的目录State of Qatar。

  include $(CLEAR_VARS)

  CLEAR_VAEscortS 由编写翻译系统提供(能够在 android 安装目录下的/build/core/config.mk 文件看见其定义,为 CLEA福睿斯_VARS:=$(BUILD_SYSTEM)/clear_vars.mk卡塔尔,内定让GNU MAKEFILE该脚本为你撤消许多 LOCAL_XXX 变量 ( 例如 LOCAL_MODULE , LOCAL_SRC_FILES ,LOCAL_STATIC_LIBRARIES,等等…),除 LOCAL_PATH。那是供给的,因为具备的编写翻译文件都在同叁个 GNU MAKE 实践情形中,全部的变量都以大局的。所以大家须求先清空那个变量(LOCAL_PATH除外)。又因为LOCAL_PATH总是供给在每一个模块中都要拓宽安装,所以并索要清空它。

别的注意,该语句的情趣正是把CLEAGL450_VA奥迪Q7S变量所针对的剧本文件包蕴进来。

  LOCAL_MODULE := helloworld

  LOCAL_MODULE 变量必得定义,以标志你在 Android.mk 文件中呈报的各种模块。名称必需是举世无双的,并且不包罗别的空格。注意编写翻译系统会活动发出合适的前缀和后缀,换句话说,二个被命名称叫'foo'的分享库模块,将会生成'libfoo.so'文件。

小心:假若把库命名叫‘libhelloworld’,编写翻译系统将不会增进此外的 lib 前缀,也会生成 libhelloworld.so。

  LOCAL_SRC_FILES := helloworld.c

  LOCAL_SRC_FILES 变量必需包蕴将在编写翻译打包进模块中的 C 或 C++源代码文件。不用

在此边列出头文件和带有文件,编写翻译系统将会自动搜索正视型的文本,当然对于富含文件,你包蕴时钦命的门路应该准确。

注意,默认的 C++源码文件的增添名是‘.cpp’ 。内定一个比不上的扩展名也是也许的,只要定义LOCAL_DEFAULT_CPP_EXTENSION 变量,不忘记记最初的小圆点(也便是概念为  ‘.cxx’,并不是‘cxx’State of Qatar

  include $(BUILD_SHARED_LIBRARY)

  BUILD_SHARED_LIBRAXC90Y 是编译系统提供的变量,指向三个 GNU Makefile 脚本(

尽管在 build/core  目录下的 shared_library.mk) ,将根据LOCAL_XXX类别变量中的值,来编写翻译生成分享库(动态链接库)。

举例想生成静态库, 则用 BUILD_STATIC_LIBRARY

大器晚成经要生成可实行文件, 则用 BUILD_EXECUTABLE

  在NDK的sources/samples目录下有更头眼昏花一点的例证,写有注释的 Android.mk 文件。

 

 include $(BUILD_SHARED_LIBRARY)

LOCAL_SRC_FILES := foo.c\ toto/bar.c

1. Android.mk 的应用范围

Android.mk文件是GNU Makefile的一小部分,它用来对Android程序开展编写翻译。

三个Android.mk文件能够编写翻译七个模块,每一个模块属下列类型之生机勃勃:

  1)APK程序

  日常的Android程序,编写翻译打包生成apk文件

  2)JAVA库

  java类库,编写翻译打包生成jar文件

  3)C\C++应用程序

 可进行的C\C++应用程序

  4)C\C++静态库 

编写翻译生成C\C++静态库,并打包成.a文件

  5)C\C++共享库

编译生成分享库(动态链接库),并打包成.so文, 有且独有分享库技艺被设置/复制到您的运用软件(APK)包中。

 

注意,C++源文件的暗中认可扩展名是“.CPP”。不过,能够透过定义变量LOCAL_CPP_EXTENSION来钦赐分歧的变量本地扩大名。不要遗忘带头点(即“.cxx”有效,实际不是“cxx”)。

GNU Make 提供的功用宏,只有由此相同:$(call function)的形式来收获其值,它将回到文本化的音信。

3.4. GNU Make‘功能’宏

GNU Make‘功效’宏,必得经过选择'$(call  卡塔尔国'来调用,调用他们将重回文本化的音讯。

(1)my-dir:重返当前 Android.mk 所在的目录的路线,相对于 NDK 编写翻译系统的顶层。那是有效的,在 Android.mk 文件的初阶如此定义:

LOCAL_PATH := $(call my-dir)

(2)all-subdir-makefiles: 重返二个身处当前'my-dir'路线的子目录中的全部Android.mk的列表。

比方说,看上边包车型大巴目录档案的次序:

sources/foo/Android.mk

sources/foo/lib1/Android.mk

sources/foo/lib2/Android.mk

 假诺 sources/foo/Android.mk 包括风度翩翩行:

include $(call all-subdir-makefiles)

那就是说它就能自行满含 sources/foo/lib1/Android.mk 和 sources/foo/lib2/Android.mk。

那项功能用于向编写翻译系统提供深档期的顺序嵌套的代码目录档次。

注意,在暗中认可情形下,NDK 将会只寻觅在 sources/*/Android.mk 中的文件。

(3)this-makefile:  重临当前Makefile 的不二秘技(即那么些函数调用的地方State of Qatar

(4)parent-makefile:  再次来到调用树中父 Makefile 路线。即包括当前Makefile的Makefile 路径。

(5)grand-parent-makefile:再次来到调用树中父Makefile的父Makefile的路线

  1. 以LOCAL_ 为发端的
  2. 以PRIVATE_ ,NDK_ 或者APP_ 开首的名字。
  3. 小写字母名字:如my-dir

回去近期三遍include的Makefile的门道。常常再次来到Android.mk所在的门道。它用来作为Android.mk的开头来定义LOCAL_PATH.

3.1. 自定义变量

 以上是在 Android.mk中正视或概念的变量列表, 能够定义其他变量为本身行使,可是NDK编写翻译系统封存下列变量名:

 -以 LOCAL_始发的名字(比方 LOCAL_MODULE)

 -以 PRIVATE_, NDK_ 或 APP_起来的名字(内部使用)

 -小写名字(内部接受,比方‘my-dir’)

  如若为了便于在 Android.mk 中定义本人的变量,提出使用 MY_前缀,一个小例子:

MY_SOURCES := foo.c

ifneq ($(MY_CONFIG_BAR),)

 MY_SOURCES += bar.c

endif

LOCAL_SRC_FILES += $(MY_SOURCES)

瞩目:‘:=’是赋值的意味;'+='是充实的意思;‘$’表示援用某变量的值。

 LOCAL_PATH := $(call my-dir)

返回include tree中父Makefile 路径。 也就是include 当前Makefile的Makefile Path。

3. Android.mk 语法

骨干语法:Simple example

允许寻觅并inport别的modules到本Android.mk中来。 它会从NDK_金沙js777,MODULE_PATH搜索钦定的模块名。

3.3. 模块描述变量

  下边包车型客车变量用于向编写翻译系统描述您的模块。你应该定义在'include  $(CLEA索罗德_VARS)'和'include $(BUILD_XXXXX卡塔尔(قطر‎'之间。正如前方描写的那么,$(CLEALAND_VARAV4S卡塔尔国是三个剧本,覆灭全体这几个变量。

  (1) LOCAL_PATH:  那些变量用于给出当前文件的渠道。必得在 Android.mk 的发端定义,能够那样使用:LOCAL_PATH := $(call my-dir卡塔尔  这些变量不会被$(CLEA宝马X3_VAHavalS卡塔尔(قطر‎消亡,因而种种 Android.mk 只须求定义三回(即便在二个文件中定义了多少个模块的情状下卡塔尔。

  (2)LOCAL_MODULE: 那是模块的名字,它必需是独步天下的,何况不能够包涵空格。必得在包含任大器晚成的$(BUILD_XXXX卡塔尔(قطر‎脚本从前定义它。模块的名字决定了变通文书的名字。比如,纵然叁个叁个分享库模块的名字是,那么生成文书的名字正是 lib.so。然而,在的 NDK 生成文

件中(大概 Android.mk 大概 Application.mk卡塔尔(قطر‎,应该只关乎(援用卡塔尔(قطر‎有健康名字的任何模块。

  (3)LOCAL_SRC_FILES:  那是要编译的源代码文件列表。只要列出要传送给编写翻译器的文件,因为编译系统自动测算重视。注意源代码文件名称都是绝对于 LOCAL_PATH的,你能够使用路线部分,比方:

LOCAL_SRC_FILES := foo.c toto/bar.c\

Hello.c

 文件之间能够用空格或Tab键实行私分,换行请用"\".假如是追加源代码文件的话,请用LOCAL_SRC_FILES +=

注意:在改变文书中都要运用UNIX风格的斜杠(/State of Qatar.windows风格的反斜杠不会被科学的管理。

注意:可以LOCAL_SRC_FILES := $(call all-subdir-java-filesState of Qatar这种样式来含有local_path目录下的拥有java文件。

  (4) LOCAL_CPP_EXTENSION:  那是叁个可选变量, 用来钦赐C++代码文件的扩大名,暗中同意是'.cpp',不过足以更改它,比方:

js3845金沙线路,LOCAL_CPP_EXTENSION := .cxx

  (5) LOCAL_C_INCLUDES:  可选变量,表示头文件的追寻路线。默许的头文件的查找路线是LOCAL_PATH目录。

  示例:LOCAL_C_INCLUDES := sources/foo或LOCAL_C_INCLUDES := $(LOCAL_PATH)/../foo

  LOCAL_C_INCLUDES必要在任何带有LOCAL_CFLAGS/LOCAL_CPPFLAGS标识此前开展设置。

  (6)LOCAL_CFLAGS:  可选的编写翻译器选项,在编译 C 代码文件的时候使用。那恐怕是有

用的,钦命二个外加的含有路线(相对于NDK的顶层目录卡塔尔(قطر‎,宏定义,可能编写翻译选项。

  注意:不要在 Android.mk 中改换 optimization/debugging 等级,只要在 Application.mk 中钦命合适的新闻,就能够自动地为你管理那些标题,在调治时期,会让 NDK自动生成有用的数据文件。

  (7)LOCAL_CXXFLAGS:  与 LOCAL_CFLAGS同理,针对 C++源文件。

  (8)LOCAL_CPPFLAGS:  与 LOCAL_CFLAGS同理,但是对 C 和 C++ source files都适用。

  (9)LOCAL_STATIC_LIBRATiggoIES: 表示该模块需求动用什么静态库,以便在编写翻译时进行链接。

  (10)LOCAL_SHARED_LIBRAENVISIONIES:  代表模块在运作时要信赖的分享库(动态库),在链接时就须要,以便在变化莫测文书时寄放其相应的音信。注意:它不会附加列出的模块到编写翻译图,也正是依然须求在Application.mk 中把它们拉长到程序必要的模块中。

  (11)LOCAL_LDLIBS:  编写翻译模块时要利用的增大的链接器选项。那对于利用‘-l’前缀传递钦赐库的名字是行得通的。

例如,LOCAL_LDLIBS := -lz表示报告链接器生成的模块要在加载时刻链接到/system/lib/libz.so

  可查阅 docs/STABLE-APIS.TXT 获取使用 NDK发行版能链接到的开放的种类库列表。

  (12) LOCAL_ALLOW_UNDEFINED_SYMBOLS:  暗许情形下, 在希图编写翻译一个分享库时,任何未定义的援引将引致一个“未定义的标识”错误。那对于在源代码文件中捕捉错误会有非常大的提携。可是,假若因为某个原因,要求不运维那项检查,可把那些变量设为‘true’。

专心相应的分享库大概在运维时加载退步。(那几个平常尽量不要去设为 trueState of Qatar。

  (13) LOCAL_ARM_MODE: 默认情状下, arm指标二进制会以 thumb 的款型转换(16 位State of Qatar,你能够通过设置那一个变量为 arm假诺你指望您的 module 是以 32 位指令的款型。

'arm' (32-bit instructions) mode. E.g.:

LOCAL_ARM_MODE := arm

专心:能够在编写翻译的时候告诉系统针对有个别源码文件举行一定的项目标编写翻译

比如,LOCAL_SRC_FILES := foo.c bar.c.arm  那样就报告系统总是将 bar.c 以arm的形式编写翻译。

(14)LOCAL_MODULE_PATH 和 LOCAL_UNSTRIPPED_PATH

在 Android.mk 文件中, 还足以用LOCAL_MODULE_PATH 和LOCAL_UNSTRIPPED_PATH钦赐最终的指标设置路线.

昨今不一样的文件系统路线用以下的宏举办分选:

  TARGET_ROOT_OUT:表示根文件系统。

   TARGET_OUT:表示 system文件系统。

   TARGET_OUT_DATA:表示 data文件系统。

用法如:LOCAL_MODULE_PATH :=$(TARGET_ROOT_OUT) 

至于LOCAL_MODULE_PATH 和LOCAL_UNSTRIPPED_PATH的分别,临时还不知道。

因而,请尽量少的在Android.mk中宣示变量,也决不假定任何事物不会在深入分析进程中定义。

include $(BUILD_SHARED_LIBRARY)

type describe
BUILD_STATIC_LIBRARY 编译为静态库。
BUILD_SHARED_LIBRARY 编译为动态库
BUILD_EXECUTABLE 编译为Native C可执行程序

该类变量用来给Build System描述模块音信。在'include $(CLEA奥迪Q7_VARS)' 和 'include $(BUILD_XXXXX卡塔尔(قطر‎'之间。必得定义此类变量。

那是少不了的,因为具有的营造调整文件在八个gnu make实践上下文中深入分析,其中具有变量都以大局的。

2.3.12:LOCAL_SHARED_LIBRARIES:

Android.mk是Android提供的豆蔻梢头种makefile文件,用来钦命诸如编写翻译生成so库名、援用的头文件目录、须求编写翻译的.c/.cpp文件和.a静态库文件等。

2.3.18:LOCAL_DISABLE_NO_EXECUTE

NDK Build System 保留以下变量名:

LOCAL_CPPFLAGS的别名。

LOCAL_SRC_FILES变量必得包蕴C和/或C++源文件的列表,那么些文件将被营造并创设到模块中。

2.1.3:BUILD_STATIC_LIBRARY

在乎你应当这里不列出头文件和满含的文件,因为营造系统将自行为你计算信任项;只列出源文件那将间接传送给编写翻译器。

本着一个build 脚本,用来钦命二个事前编写翻译多数动态库。 与BUILD_SHARED_LIBRARY and BUILD_STATIC_LIBRARY不同,

名称必需是唯一且不分包其余空间。

举例: 布局如下:

android.mk文件必需以本地路线变量的概念开头。它用于在付出树中定位源文件。在本例中,由营造系统提供的宏函数'my dir'用于再次回到当前目录的不二秘籍(即含有android.mk文件本人的目录)。

可选。用来钦定C++ features。

Android.mk文件语法允许大家将Source打包成三个"modules". modules能够是:1. 静态库2. 动态库

LOCAL_STATIC_LIBRARIES and LOCAL_WHOLE_STATIC_LIBRA奥迪Q5IES将陈说之。

Android NDK(Native Development Kit)是生机勃勃套工具集合,允许你用像C/C++语言那样达成应用程序的一片段。

armeabi For ARMv5TE  armeabi-v7a

BUILD_SHARED_LIBRA陆风X8Y是由营造系统提供的一个变量,它指向负担采摘全体自最新“include$(clear_vars)”以来,您在地面变量中定义的新闻,并规定要创设什么以致如何营造。

注意:此处NDK版本为NDK 本田UR-V7C.(分歧NDK版本,ndk-build所发出的Makefile并不完全相通**

Android.mk文件用来告诉NDK Build系统有关Source的音信。 Android.mk将是GNU Makefile的风流洒脱部分,且将被Build System浅析一次或频仍。

LOCAL_C_INCLUDES := sources/foo  LOCAL_C_INCLUDES := $(LOCAL_PATH)/../foo

 include $(CLEAR_VARS)

2.3.7:LOCAL_C_INCLUDES

参谋:android编写翻译系统makefile(Android.mk卡塔尔国写法Android.mk 文件语法详明Android.mk

并垄断(monopoly卡塔尔国怎样将你列出的Source编译成多个可进行Native程序。

type example describ
CLEAR_VARS include $(CLEAR_VARS) 必须在新模块前包含之
BUILD_SHARED_LIBRARY include $(BUILD_SHARED_LIBRARY) 决定如何将你列出的Source编译成一个动态库
BUILD_STATIC_LIBRARY include $(BUILD_STATIC_LIBRARY) 决定如何将你列出的Source编译成一个静态库
BUILD_EXECUTABLE 决定如何将你列出的Source编译成一个可执行Native程序 include $(BUILD_EXECUTABLE)
PREBUILT_SHARED_LIBRARY include $(PREBUILT_SHARED_LIBRARY) 把这个共享库声明为 “一个” 独立的模块
PREBUILT_STATIC_LIBRARY include $(PREBUILT_STATIC_LIBRARY) 把这个静态库库声明为 “一个” 独立的模块
TARGET_ARCH 目标CPU架构名
TARGET_PLATFORM 目标平台的名字
TARGET_ARCH_ABI
LOCAL_C_INCLUDES LOCAL_C_INCLUDES := sources/foo 一个可选的path列表。
LOCAL_CFLAGS LOCAL_CFLAGS += -I<path> 一个可选的设置,在编译C/C++ source 时添加如Flags
LOCAL_STATIC_LIBRARIES 要链接到本模块的静态库list
LOCAL_SHARED_LIBRARIES 要链接到本模块的动态库
LOCAL_LDLIBS LOCAL_LDLIBS := -lz 可以用它来添加系统库

2.3.15:LOCAL_ALLOW_UNDEFINED_SYMBOLS:

请小心,营造系统将自动向相应退换的文件加多适当的前缀和后缀。换言之,名称叫“foo”的分享库模块将调换“libfoo.so”。

设置为true时,会讲浮点编写翻译成neon指令。那会大幅地加快浮点运算(前提是硬件扶植卡塔尔

当今,让我们解释一下那些行。

LOCAL_CPP_EXTENSION := .cxx 从NDK 昂Cora7后,能够写八个:

js3845金沙线路 1image.png

BUILD_STATIC_LIBRARY:编写翻译为静态库。

 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_SRC_FILES := hello-jni.c include $(BUILD_SHARED_LIBRARY)

include $(PREBUILT_SHARED_LIBRARY) # 注意这里不是 BUILD_SHARED_LIBRARY

 LOCAL_SRC_FILES := hello-jni.c

BUILD_SHARED_LIBRARY:编写翻译为动态库

clear_vars变量由创设系统提供,并针对三个特别的GNU makefile,它将为您消释比很多LOCAL_xxx变量。例如LOCAL_MODULE、OCAL_SRC_FILES、LOCAL_STATIC_LIBRARIES等),LOCAL_PATH除外。

三个可选的path列表。相对于NDK ROOT 目录。编写翻译时,将会把这一个目录附上。

自然还应该有BUILD_STATIC_LIBRAPRADOY来生成静态库。

例如:LOCAL_PATH := $(call my-dir)  LOCAL_PATH不会被include $(CLEAR_VARS) 清理。

必需定义LOCAL_MODULE变量以标志您在android.mk中描述的各种模块。

2.2.2:all-subdir-makefiles:

LOCAL_PATH := $(call my-dir)

LOCAL_MODULE := foo-prebuilt     # 模块名

2.3.4:LOCAL_SRC_FILES

它担任采撷自从上次调用include $(CLEAR_VARS)后的全体LOCAL_XXX音讯。并决定编译为何。

在If sources/foo/Android.mk 中, include $(call all-subdir-makefiles卡塔尔(قطر‎那则自动include 了sources/foo/lib1/Android.mk and sources/foo/lib2/Android.mk。

不必列出头文件,build System 会自动帮大家找寻重视文件。

以此清理动作是必得的,因为兼具的编译调节文件由同三个GNU Make深入解析和实行,其变量是大局的。所以清理后工夫幸免相互成效。

2.3.17:LOCAL_ARM_NEON:

唯有targeting 为 'armeabi-v7a'时才足以。

include $(BUILD_STATIC_LIBRARY)

$(call import-module,)

把那些分享库证明为 “一个” 独立的模块。

用来附加编写翻译选项。 注意:不要品味在此边纠正编译的优化增选和Debug等第。它会通过您Application.mk中的音信自动钦命。

先是看四个最轻巧易行的Android.mk的例证:

include $(CLEAR_VARS)

1. Android.mk语法:

2.3.5:LOCAL_CPP_EXTENSION:

2.3.10:LOCAL_CPPFLAGS:

LOCAL_MODULE    := hello-jni

要链接到本模块的静态库list。(built with BUILD_STATIC_LIBRARY)

叁个可选的装置,在编写翻译C/C++ source 时增添如Flags。

2.2.4:parent-makefile