Android NDK开发学习(四)
最后更新于:2022-04-01 16:21:35
[Android NDK开发学习(一):环境的配置](http://blog.csdn.net/qq_17766199/article/details/48174875)
[Android NDK开发学习(二):学习官方Demo : HelloJni](http://blog.csdn.net/qq_17766199/article/details/48179073)
[Android NDK开发学习(三):创建第一个项目](http://blog.csdn.net/qq_17766199/article/details/48241815)
**Android NDK开发学习(四):NDK配置介绍**
NDK程序可以使用两个配置文件:Android.mk和Application.mk,其中Android.mk文件主要描述了如何编译C/C++代码,而Application文件用于描述当前应用程序需要哪些模块。(因为本人解除NDK时间也不长,所以相关的关键字遇到的也不多。这里介绍一些自己遇到的。以后有新的会持续更新。)
这里我采取的方法时导入官方Demo:HelloNeon和NativeActivity这个项目。查看Android.mk和Application.mk文件。对遇到的关键词进行查找资料。这里汇总一下。
1、首先是HelloNeon项目的Android.mk(导入方法见前面的教程方法)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f24ea694dc.jpg)
由上到下:
(1).第一行LOCAL_PATH:该变量用于指定当前Android.mk文件所在的路径。必须在Android.mk文件第一行定义。
(2).第三行CLEAR_VARS: 指定一个用于**清空几乎**所有以LOCAL_开头的变量(除了LOCAL_PATH变量)。在Android.mk文件的第二行**必须**执行这个脚本,这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。如:include $(CLEAR_VARS)。
(3).第五行LOCAL_MODULE:该变量指定模块名字。此名称**必须是所有模块名中唯一存在的,并且不包括空白分隔符**。模块名决定生成的库文件名,如:模块名位Hello,生成的动态库文件名就为libHello.so。我们在引用模块的时候,只能使用定义的模块名,不应使用库文件名。
(4).第七行与第十四行LOCAL_SRC_FILES:该变量制定了参与模块编译的C/C++源文件名。文件名都相对于LOCAL_PATH,如果指定多个文件,中间用空格分隔。
(5).第九行和第十一行TARGET_ARCH_ABI:用于分析Android.mk的目标CPU+ABI的名称(ABI,即应用程序二进制接口)。**所有基于ARM的ABI都必须将TARGET_ARCH变量的值设为arm,但可以设置不同的TARGET_ARCH_ABI变量值**。
(6).第十行和第十二行LOCAL_CFLAGS += -DXXX 相当于在所有源文件中增加一个宏定义#define XXX。
例如:代码第十行为LOCAL_CFLAGS := -DHAVE_NEON=1 所以在helloneon.c文件中有如图一段代码:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f24eab7384.jpg)
(7).第十七行LOCAL_STATIC_LIBRARIES表示该模块需要使用哪些静态库,以便在编译时进行链接。
(8).第十九行LOCAL_LDLIBS链接的库不产生依赖关系,一般用于不需要重新编译的库,如库不存在,则会报错找不到。且貌似只能链接那些存在于系统目录下本模块需要连接的库。如果某一个库既有动态库又有静态库,那么在默认情况下是链接的动态库而非静态库。这里是链接log库,用于在文件中打印信息。
(9).第二十一行BUILD_SHARED_LIBRARY指定一个建立共享库的GNU Make脚本文件。该脚本文件会根据以“LOCAL_”开头的变量决定如何生成共享库,其中LOCAL_MODULE和LOCAL_SRC_FILES是必须设置的两个变量。该变量的用法:include $(BUILD_SHARED_LIBRARY),生成的共享库文件名是$(LOCAL_MODULE).so。
(10).要想导入一个模块,放置如下所示的一行指令,最好放在你的Android.mk文件结束处:$(call import-module,<tag>)。这里导入
cpufeatures用于第十七行的编译。
(11).对于第九行至第十五行的简单理解:如果是armeabi-v7a和x86平台则编译helloneon-intrinsics.c.neon文件。编译结果如下图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f24eaccbcd.jpg)
2、NativeActivity项目的Application.mk
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f24eae3761.jpg)
(1).APP_ABI在默认情况下,NDK会使用'armeabi' ABI 来生成二进制机器码,这是基于ARMv5TE的浮点运算CPU,这可以通过使用此变量来选项不同的ABI.
(2).APP_PLATFORM 制定编译Android平台名称。
3、HelloNeon项目编译后:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f24eb05146.jpg)
4、补充
(1).BUILD_STATIC_LIBRARY:指定一个简历静态库的GNU Make脚本。静态库不能被复制到Android应用程序包(apk)中,但可以用于建立共享库。使用该变量的方法:include $(BUILD_STATIC_LIBRARY),生成的静态库文件名是$(LOCAL_MODULE).a。
(2).TARGET_ARCH:编译Android的目标CPU架构的名称。如:arm。
(3).TARGET_PLATFORM:指定分析Android.mk文件的Android平台名称。
(4).TARGET_ABI:用于连接目标平台和ABI,也就是$(TARGET_PLATFORM)-$(TARGET_ARCH_ABI),主要用来测试真是设别中特定的目标系统映像。
最后附上参考链接:[点击打开链接](http://blog.csdn.net/kwuwei/article/details/19428993) [点击打开链接](http://blog.csdn.net/kwuwei/article/details/21718097)