Android NDK开发学习(一):环境的配置

Android NDK开发学习(二):学习官方Demo : HelloJni

Android NDK开发学习(三):创建第一个项目

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(导入方法见前面的教程方法)

android ndk 创建项目 ndk android.mk_android ndk 创建项目

由上到下:

(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文件中有如图一段代码:

android ndk 创建项目 ndk android.mk_android ndk 创建项目_02

(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文件。编译结果如下图:


android ndk 创建项目 ndk android.mk_Android_03

NativeActivity项目的Application.mk

android ndk 创建项目 ndk android.mk_静态库_04

(1).APP_ABI

在默认情况下,NDK会使用'armeabi' ABI 来生成二进制机器码,这是基于ARMv5TE的浮点运算CPU,这可以通过使用此变量来选项不同的ABI.

(2).APP_PLATFORM 制定编译Android平台名称。


3、HelloNeon项目编译后:

android ndk 创建项目 ndk android.mk_android ndk_05


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),主要用来测试真是设别中特定的目标系统映像。