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)
';