Android NDK编程浅入深出之--Android.mk(2)

来源:互联网 发布:linux怎么看硬盘空间 编辑:程序博客网 时间:2024/05/17 07:29
在Android平台上使用原生组件的推荐和支持的方法是将它们打包成共享库。但是,为了方便测试和进行快速原型设计,Android NDK也支持构建独立的可执行文件。这些独立的可执行文件是不用打包成APK文件就可以复制到Andr

在Android平台上使用原生组件的推荐和支持的方法是将它们打包成共享库。但是,为了方便测试和进行快速原型设计,Android NDK也支持构建独立的可执行文件。这些独立的可执行文件是不用打包成APK文件就可以复制到Android设备上的常规Linux应用程序,而且它们可以直接执行,而不通过Java应用程序加载。生成独立可执行文件需要在Android.mk构建文档中导入BUILD_EXECUTABLE变量,而不是导入BUILD_SHARED_ LIBRARY变量,如程序:

BUILD_EXECUTABLE变量指向build-executable.mk Makefile片段,该片段包含了在Android平台上生成独立可执行文件的必要步骤。独立可执行文件以与模块相同的名称被放在libs/目录下。尽管放在该目录下,但在打包阶段它并没有被包含在APK文件中。

8. 其他构建系统变量

除了在前几节提到的变量之外,Android NDK构建系统还支持其他变量,本节将对这些变量进行简要说明。

构建系统定义的变量有:

TARGET_ARCH:目标CPU体系结构的名称,例如arm

TARGET_PLATFORM:目标Android平台的名称,例如:android-3

TARGET_ARCH_ABI:目标CPU体系结构和ABI的名称,例如:armeabi-v7a

TARGET_ABI:目标平台和ABI的串联,例如:android-3-armeabi-v7a

可被定义为模块说明部分的变量有:

LOCAL_MODULE_FILENAME:可选变量,用来重新定义生成的输出文件名称。默认情况下,构建系统使用LOCAL_MODULE的值作为生成的输出文件名称,但变量LOCAL_MODULE_ FILENAME可以覆盖LOCAL_MODULE的值。

LOCAL_CPP_EXTENSION:C++源文件的默认扩展名是.cpp。这个变量可以用来为C++源代码指定一个或多个文件扩展名。

LOCAL_CPP_FEATURES:可选变量,用来指明模块所依赖的具体C++特性,如RTTI、exceptions等。

LOCAL_C_INCLUDES:可选目录列表,NDK安装目录的相对路径,用来搜索头文件。

LOCAL_CFLAGS:一组可选的编译器标志,在编译C和C++源文件的时候会被传送给编译器。

LOCAL_CPP_FLAGS:一组可选的编译标志,在只编译C++源文件时被传送给编译器。

LOCAL_WHOLE_STATIC_LIBRARIES:LOCAL_STATIC_LIBRARIES的变体,用来指明应该被包含在生成的共享库中的所有静态库内容。

(当几个静态库之间有循环依赖时,LOCAL_WHOLE_STATIC_LIBRARIES很有用。)

LOCAL_LDLIBS:链接标志的可选列表,当对目标文件进行链接以生成输出文件时该标志将被传送给链接器。它主要用于传送要进行动态链接的系统库列表。例如:要与Android NDK日志库链接,使用以下代码:

  • LOCAL_LDFLAGS :=?llog

    LOCAL_ALLOW_UNDEFINED_SYMBOLS:可选参数,它禁止在生成的文件中进行缺失符号检查。若没有定义,链接器会在符号缺失时生成错误信息。

    LOCAL_ARM_MODE:可选参数,ARM机器体系结构特有变量,用于指定要生成的ARM二进制类型。默认情况下,构建系统在拇指模式下用16位指令生成,但该变量可以被设置为arm来指定使用32位指令。

  • LOCAL_ARM_MODE :=arm

    该变量改变了整个模块的构建系统行为;可以用.arm扩展名指定只在arm模式下构建特定文件。

  • LOCAL_SRC_FILES :=file1.c file2.c.arm

    LOCAL_ARM_NEON:可选参数,ARM机器体系结构特有变量,用来指定在源文件中应该使用的ARM高级单指令流多数据流(Single Instruction Multiple Data,SIMD)(a.k.a. NEON)内联函数。

  • LOCAL_ARM_NEON :=true

    该变量改变了整个模块的构建系统行为;可以用.neon扩展名指定只构建带有NEON内联函数的特定文件。

  • LOCAL_SRC_FILES :=file1.c file2.c.neon

    LOCAL_DISABLE_NO_EXECUTE:可选变量,用来禁用NX Bit安全特性。NX Bit代表Never Execute(永不执行),它是在CPU中使用的一项技术,用来隔离代码区和存储区。这样可以防止恶意软件通过将它的代码插入应用程序的存储区来控制应用程序。

  • LOCAL_DISABLE_NO_EXECUTE :=true

    LOCAL_EXPORT_CFLAGS:该变量记录一组编译器标志,这些编译器标志会被添加到通过变量LOCAL_STATIC_LIBRARIES或LOCAL_SHARED_LIBRARIES使用本模块的其他模块的LOCAL_CFLAGS定义中。

    编译器在构建module1时会以-DENABLE_AUDIO –DDEBUG标志执行。

    LOCAL_EXPORT_CPPFLAGS:和LOCAL_EXPORT_CLAGS一样,但是它是C++特定代码编译器标志。

    LOCAL_EXPORT_LDFLAGS:和LOCAL_EXPORT_CFLAGS一样,但用作链接器标志。

    LOCAL_EXPORT_C_INCLUDES:该变量允许记录路径集,这些路径会被添加到通过变量LOCAL_STATIC_LIBRARIES或LOCAL_SHARED_LIBRARIES使用该模块的LOCAL_C_INCLUDES定义中。

    LOCAL_SHORT_COMMANDS:对于有大量资源或独立的静态/共享库的模块,该变量应该被设置为true。诸如Windows之类的操作系统只允许命令行最多输入8 191个字符;该变量通过分解构建命令使其长度小于8 191个字符。在较小的模块中不推荐使用该方法,因为使用它会让构建过程变慢。

    LOCAL_FILTER_ASM:该变量定义了用于过滤来自LOCAL_SRC_FILES变量的装配文件的应用程序。

    9. 其他的构建系统函数宏

    本节概括了Android NDK构建系统支持的其他函数宏。

    all-subdir-makefiles:返回当前目录的所有子目录下的Android.mk构建文件列表。例如,调用以下命令可以将子目录下的所有Android.mk文件包含在构建过程中:

  • include $(call all-subdir-makefiles)

    this-makefile:返回当前Android.mk构建文件的路径。

    parent-makefile:返回包含当前构建文件的父Android.mk构建文件的路径。

    grand-parent-makefile:和parent-makefile一样但用于祖父目录。

    10. 定义新变量

    开发人员可以定义其他变量来简化他们的构建文件。以LOCAL_和NDK_前缀开头的名称预留给Android NDK构建系统使用。建议开发人员定义的变量以MY_开头,如程序:

    11. 条件操作

    Android.mk构建文件也可以包含关于这些变量的条件操作,例如:在每个体系结构中包含一个不同的源文件集,如程序:

     

  • ...

    Application.mk

    Application.mk是Android NDK构建系统使用的一个可选构建文件。和Android.mk文件一样,它也被放在jni目录下。Application.mk也是一个GUN Makefile片段。它的目的是描述应用程序需要哪些模块;它也定义所有模块的通用变量。以下是Application.mk构建文件支持的变量:

    APP_MODULES:默认情况下,Android NDK构建系统构建Android.mk文件声明的所有模块。该变量可以覆盖上述行为并提供一个用空格分开的、需要被构建的模块列表。

    (责任编辑:幽灵学院)
  • 0 0