在学习Android 驱动HAL开发过程中,经常会需要编写相应的Android NDK调用程序,这里面设计到许多NDK中的知识,主要是文件的配置、函数的编写以及API的调用。这里对经常用到的内容做一个简单的归纳。

1、Android NDK配置文件详解

NDK程序可以使用两个配置文件:Android.mk和Application.mk,其中Android.mk文件主要描述了如何编译C/C++代码,而Application文件用于描述当前应用程序需要哪些模块。
首先是Android.mk文件的全局变量:

  1. CLEAR_VARS: 指定一个用于清空几乎所有以LOCAL_开头的变量(除了LOCAL_PATH变量)。在Android.mk文件的第二行必须执行这个脚本,如下:include $(CLEAR_VARS).

  2. BUILD_SHARED_LIBRARY:指定一个建立共享库的GNU Make脚本文件。该脚本文件会根据以“LOCAL_”开头的变量决定如何生成共享库,其中LOCAL_MODULE和LOCAL_SRC_FILES是必须设置的两个变量。该变量的用法:include $(BUILD_SHARED_LIBRARY),生成的共享库文件名是$(LOCAL_MODULE).so。

  3. BUILD_STATIC_LIBRARY:指定一个简历静态库的GNU Make脚本。静态库不能被复制到Android应用程序包(apk)中,但可以用于建立共享库。使用该变量的方法:include $(BUILD_STATIC_LIBRARY),生成的静态库文件名是$(LOCAL_MODULE).a。

  4. TARGET_ARCH:编译Android的目标CPU架构的名称。如:arm。

  5. TARGET_PLATFORM:指定分析Android.mk文件的Android平台名称。

  6. TARGET_ARCH_ABI:用于分析Android.mk的目标CPU+ABI的名称(ABI,即应用程序二进制接口)。所有基于ARM的ABI都必须将TARGET_ARCH变量的值设为arm,但可以设置不同的TARGET_ARCH_ABI变量值

  7. TARGET_ABI:用于连接目标平台和ABI,也就是$(TARGET_PLATFORM)-$(TARGET_ARCH_ABI),主要用来测试真是设别中特定的目标系统映像。

2. Android NDK定义的函数

在Android NDK中还定义了很多GNU Make函数,这些函数需要使用如下语法格式来调用,并返回文本信息:

$(call<function>)

下面是这些函数的功能及用法:

  1. my-dir:返回Android.mk文件所在的目录,该函数一般用于设置LOCAL_PATH变量。用法:
    LOCAL_PATH:=$(call my-dir)
  2. all-subdir-makefiles:返回Android.mk文件所在目录中所有包含Android.mk文件的子目录列表。例如
    android/mc/Android.mkandroid/mc/obj/Android.mkandroid/mc/usr/Android.mk
  3. this-makefile:返回当前GNU Makefile的路径
  4. parent-makefile:返回当前调树中父级的Makefile路径。
    grand-parent-makefile:从这个函数的名字不难看出功能,返回parent的parent makefile的路径。

3. 描述模块的变量

通常定义在include $(CLEAR_VARS)和$(BUILD_XXX)之间。

  1. LOCAL_PATH:该变量用于指定当前Android.mk文件所在的路径。必须在Android.mk文件第一行定义
    LOCAL_PATH:=$(call my-dir)
  2. LOCAL_MODULE:该变量指定模块名字。此名称必须是所有模块名中唯一存在的,并且不包括空白分隔符。模块名决定生成的库文件名,如:模块名位Hello,生成的动态库文件名就为libHello.so。我们在引用模块的时候,只能使用定义的模块名,不应使用库文件名
  3. LOCAL_SRC_FILES:该变量制定了参与模块编译的C/C++源文件名。文件名都相对于LOCAL_PATH,如果指定多个文件,中间用空格分隔。
  4. LOCAL_CPP_EXTENSION:该变量可选,用于设置C++源文件名,默认是cpp。
  5. LOCAL_C_INCLUDES:该变量可选,用于设置C/C++源文件所需要的便以其标志。

未完待续。。。

更多相关文章

  1. Android(安卓)Eclipse JNI 调用 .so文件加载问题
  2. 在Android(安卓)Studio运行项目时出现 Download https://service
  3. Android四大控件之Activity详解:实践篇
  4. 分享两种最简单的Android打渠道包的方法
  5. 4.0、Android(安卓)Studio配置你的构建
  6. Android中各种Adapter的使用方法
  7. 采用busybox 代替android 自带的shell
  8. Android(安卓)NDK开发技巧二
  9. Android(安卓)APK加固后如何签名

随机推荐

  1. mysql5.7 生成列 generated column用法实
  2. mysql8 公用表表达式CTE的使用方法实例分
  3. mysql中left join设置条件在on与where时
  4. mysql5.7 新增的json字段类型用法实例分
  5. mysql中各种常见join连表查询实例总结
  6. mysql 主从数据不一致,提示: Slave_SQL_Ru
  7. mysql 中 replace into 与 insert into o
  8. 解决MySQL server has gone away错误的方
  9. centos7环境下创建mysql5.6多实例的方法
  10. centos7环境下二进制安装包安装 mysql5.6