Application.mk

1 篇文章 0 订阅

缘由:在构建一个项目中的时候发现写好Android.mk的时候,发现jni文件里面系统自动生成的函数和参数发生报错现象,后来发现是Application.mk没有进行配置的原因。

在把android-ndk-r10d\samples里面的例子全部看完之后发现application.mk里面写的东西并不多,现在将我记录的给大家看一下。

APP_PLATFORM := android-24
APP_ABI := all  OR  (APP_ABI := armeabi armeabi-v7a arm64-v8a x86)   OR  (APP_ABI := armeabi-v7a x86 mips)
APP_STL := stlport_static

其实有好几个只在里面写了APP_ABI := all这一句。

APP_ABI : 默认情况下,NDK的编译系统根据 "armeabi" ABI生成机器代码。可以使用APP_ABI 来选择一个不同的ABI。

比如:为了在ARMv7的设备上支持硬件FPU指令。可以使用  APP_ABI := armeabi-v7a

或者为了支持IA-32指令集,可以使用      APP_ABI := x86

或者为了同时支持这三种,可以使用       APP_ABI := armeabi armeabi-v7a x86


APP_STL :默认,NDK构建系统提供由Android系统给出的最小C++运行时库(/system/lib/libstdc++.so)的C++头文件。
然而,NDK带有另一个C++实现,你可以在你自己的应用程序中使用或链接它。

定义APP_STL以选择它们其中的一个:

APP_STL := stlport_static       -->     static STLport library
APP_STL := stlport_shared    -->     shared STLport library
APP_STL := system                 -->     default C++ runtime library

至于APP_PLATFORM := android-24,我就不多说了,大家应该都懂


APP_OPTIM

这个变量是可选的,可以被定义成“release”或"debug",用来告诉NDK将所有的模块编译成Release版本还是Debug版本。

如果这个变量被定义成“release”的话,则NDK会将所有模块编译成Release版本的,也就是会对代码进行深度优化,并且去除所有调试信息。这样的结果就是,编译出的代码执行效率高且文件比较小,但不利于调试。

如果这个变量被定义成“debug”的话,则NDK会将所有模块编译成Debug版本的,和Release版本相反,不会对代码进行任何优化,并且会加上很多调试信息。这样的结果就是,编译出的代码执行效率比较低且文件相对较大,但调试起来很方便。

如果没有特别指定这个变量,则NDK会自动查看你的应用程序是否是可调试的(即查看你项目目录下的AndroidManifest.xml文件,看是否在<application>标签中是否将android:debuggable属性设置成了"true")来决定到底编译Release版本还是Debug版本的。

但是,如果你定义了这个变量的话,则以这个变量定义的情况为准。无论你的应用程序是否是可调试的,都不会产生影响。

APP_CFLAGS

编译选项

可以在Application.mk文件中修改此编译选项参数,此参数可以覆盖Android.mk文件中的相同定义,从而不必去Android.mk文件中修改.

需要注意地是,这个选项里的路径必须是以顶层NDK目录为相对路径,如存在以下两个文件:

sources/foo/Android.mk

sources/bar/Android.mk

如果在foo/Android.mk文件中想要添加bar目录,那么得这样便用:

APP_CFLAGS += -Isources/bar
如果这样使用:
APP_CFLAGS += -I$(LOCAL_PATH)/../bar
将会变成'-I$NDK_ROOT/../bar',从而出现并不是你想要的结果.

在android-ndk-1.5_r1时,此选项中只在C代码中被支持,而C++不支持,不过现在已经被纠正了.



之前的是项目中遇到的一些知识点,下面的是我整理的比较全面的application.mk知识点。

在Application.mk文件内定义了一些变量:
(1)APP_PROJECT_PATH(非必须
此变量值必须是你工程根目录的绝对路径.这用于指定JNI生成的.so文件安装路径或拷贝路径.
(2)APP_MODULES
此变量是可选的,如果没有在此文件中定义,则默认由Android.mk文件决定.
如果在Application.mk文件中定义此变量,那么它必须是一串由空格相隔的模块名列表,并且与Android.mk文件中的LOCAL_MODULE变量定义保持一致.需要注意地是,NDK会自动计算模块所需要的依赖文件。
注:此变量在NDK R4版本之前是在Application.mk中是必须的,所有模块必须显式地列出.
(3)APP_CXXFLAGS
APP_CPPFLAGS的别名,将来此变量将会被抛弃
(4)APP_CPPFLAGS
C++代码的编译选项。在android-ndk-1.5_r1版本中,此变量只适用于C++,但是现在可以同时适用于C和C++。

(5)APP_BUILD_SCRIPT
在默认情况下,NDK会在jni目录下查找Android.mk文件并使用它,如果你想修改它,那么在此变量中你可以指定一个你自己的脚本来执行,路径还是以工程顶层目录为相对路径.

(6)APP_GNUSTL_FORCE_CPP_FEATURES
在先前的NDK版本中,当使用GNU libstdc++ runtime运行库(通过设置APP_STL变量为gnustl_static或gnustl_shared)都会强制支持异常和RTTI,在有些极少情况下可能会出现问题,同时会使生成的机器码包含不必须的内容。
这种问题在NDK r7b中得到解决,但是这也意味着如果你真的需要支持异常和RTTI 的话,则必须显式声明。要么通过APP_CPPFLAGS,要么通过LOCAL_CPPFLAGS,或LOCAL_CPP_FEATURES。本变量就是为了解决此问题的.
有两个选项供选择,也可同时都选择.

exceptions    -> 强制所有模块支持异常.
rtti          -> 强制所有模块支持rtti.
例如:

APP_GNUSTL_FORCE_CPP_FEATURES := exceptions rtti
注意:此变量是过滤变量,将来有可能不支持.所以建议不使用此变量.




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值