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


由上到下:

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


(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,)。这里导入

cpufeatures用于第十七行的编译。

(11).对于第九行至第十五行的简单理解:如果是armeabi-v7a和x86平台则编译helloneon-intrinsics.c.neon文件。编译结果如下图:


2、NativeActivity项目的Application.mk


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

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


3、HelloNeon项目编译后:



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


最后附上参考链接:点击打开链接   点击打开链接

更多相关文章

  1. android apk 反编译,android编译错误解决方法
  2. android su程序分析
  3. Android学习09-----Android中数据的存储和访问 (1) By SharedPre
  4. 手工打包 system.img
  5. Android——NDK开发配置遇到的问题
  6. Android_DDMS快速入门
  7. Android(安卓)编译成功,先转个知识贴
  8. cocos2d-x 3.2 移植到android
  9. Android(安卓)Studio导入第三方类库、jar包和so库及Gradle

随机推荐

  1. Android(安卓)轻松实现语音朗读
  2. Android热补丁技术—dexposed原理简析(阿
  3. android进程间服务通信
  4. android里面intent的简单用法
  5. android接入即时IM(接入亲加通信云)
  6. Android(安卓)Activity与Activity切换动
  7. Android中的时间自动更新
  8. MPlayer往Android上的移植(1)
  9. Android应用程序框架层和系统运行库层日
  10. Android(安卓)获取屏幕尺寸与密度