III. NDK 开发实践
---------------------------------
下面是如何使用Android NDK开发原生代码的粗略一览:
1,
运行build/host-setup.sh配置NDK
2,
把你的源代码放在sources/
3,写sources/
4,写 apps/
5,在NDK的顶层目录中运行"make APP=
在成功的情况下,最后一步将复制共享库到你程序项目的根目录中,然后你需要使用通用的方法生成最后的.apk包。
下面,是更多的细节描述:
III.1/ 配置NDK:
-
- - - - - - - - - - - - -
在按照docs/INSTALL.TXT文件中描述的那样安装了NDK以后,你应该调用'build/host-setup.sh'脚本配置NDK。
这个脚本用于嗅探你的主机系统,验证一些首要条件,它会生成一个配置文件(例如,out/host/config-host.mk),NDK编译系统随后要用到的。
在某些情况下,可能会通知你下载一个文档包含一个预编译工具链程序,你的开发平台所需要的,把它解压缩到NDK根目录,这条消息提供足够的信息告诉你怎么做,如果你忘记了这一步,试图编译的时候,NDK会产生一条错误消息告诉你怎么做。
III.2/ 放置C/C++源代码:
-
- - - - - - - - - - - - - - - -
NDK编译系统期望你的源代码放在’sources’目录下,你应该首先创建这个目录,象这样:
$NDK/sources/
你可以自由地组织你’source’中的内容,目录的名字和结构不会对最终的程序包产生影响,因此你不必象程序包命名那样com.
为了说明,NDK提供了'sources/samples'目录,为不同的例子模块提供了几个子目录。
注意,C和C++都被支持。默认C++文件扩展名是’.cpp’,但是其他的扩展名也可以被处理。
(看docs/ANDROID-MK.TXT文件,了解细节)
把你的源代码放置在不同的地方也是可以的,只要你创建$NDK/sources/
III.3/ Writing an Android.mk build script:
- - - - - - - - - - - - - - - - - - - - - -
一个Android.mk文件是一个很小的编译脚本,它向NDK编译系统描述你的源代码,有关写作语法的细节在docs/ANDROID-MK.TXT文件中。
简单地说,NDK把你的源代码组织为一个模块组,每个模块都是下列类型之一,
-
静态库
-
共享库
你可以在一个Android.mk文件中定义几个模块,或者你可以写几个Android.mk 文件,每个定义一个模块。
所有的Android.mk文件在编译之前被解析,注意,一个Android.mk文件可能被解析几次,因此,你不能假设某个变量没有被定义。
在默认的情况下,NDK将会检查匹配下面的所有文件
$NDK/sources/*/Android.mk
如果你想要在子目录中定义Android.mk文件,你应该在顶层目录中的Android.mk文件显式地包含他们, 有一个助手函数可以帮你做到,例如,用:
include $(call all-subdir-makefiles)
这将包含当前编译路径下的子目录中的所有的Android.mk文件。
III.4/ Writing an Application.mk build file:
- - - - - - - - - - - - - - - - - - - - - - -
在用android.mk文件向编译系统描述你的模块组的同时,你还需要写一个Application.mk文件来描述你的应用程序和它所需要的模块,这个文件必须位于:
$NDK/apps/
这里,
- 你Android项目所在的路径
- 你的应用程序所需的NDK模块列表,应该就是共享库的列表。
- 可选信息,象你是否要生成一个debug版或release版,指定C或C++编译选项和其他事项。
- 计划:指定你想要支持的 平台/CPU列表,(当前仅支持一种).
一个Application.mk文件的语法是很简单的,在docs/APPLICATION-MK.TXT文件中有详细的描述。
你可以为同一个程序定义几个Application.mk文件,相应于不同编译配置。例如:
$NDK/apps/release/Application.mk
$NDK/apps/debug/Application.mk
III.5/ Invoke the NDK build system:
-
- - - - - - - - - - - - - - - - -
以命令行模式,进入NDK的顶层目录,然后象下面这样调用编译系统:
make APP=
这里make引用的是GNU Make,
这将试图使用相应的选项编译所有的模块,在成功的情况下,由Application.mk列出的最终的共享库文件将会拷贝到你的应用程序的项目路径下。(注意,未剥离的版本将保留,为了调试的目的,没有必要拷贝未剥离的二进制文件到设备上).:(注:我的理解是此处的剥离应为剥离调试信息)
IV. Debugging support:
-
- - - - - - - - - - -
使用NDK的这个初始版本调试原生代码是很粗略的。注意,我们计划在以后的版本中让它变得更容易一点,而不需要你改变原代码,Android.mk和Application.mk文件.