close

III. NDK 开发实践

---------------------------------

下面是如何使用Android NDK开发原生代码的粗略一览:

1,
运行build/host-setup.sh配置NDK

2,
把你的源代码放在sources//目录下



3
,写sources//Android.mk文件来向NDK编译系统描述你的源代码


4
,写 apps//Application.mk文件向NDK编译系统描述你的应用程序需要的原生代码。


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/作为一个符号链接,在适当操作的情况下,NDK编译系统一定能够在$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//Application.mk

这里,是一个调用NDK编译系统使用的短的描述名称,这个文件用于向NDK编译系统提供下列信息:

- 你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, 是'$NDK/apps/'子目录中的一个名字。

这将试图使用相应的选项编译所有的模块,在成功的情况下,由Application.mk列出的最终的共享库文件将会拷贝到你的应用程序的项目路径下。(注意,未剥离的版本将保留,为了调试的目的,没有必要拷贝未剥离的二进制文件到设备上).:(注:我的理解是此处的剥离应为剥离调试信息)

IV. Debugging support:

-
- - - - - - - - - - -

使用NDK的这个初始版本调试原生代码是很粗略的。注意,我们计划在以后的版本中让它变得更容易一点,而不需要你改变原代码,Android.mk和Application.mk文件.

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 angledark0123 的頭像
    angledark0123

    CONY的世界

    angledark0123 發表在 痞客邦 留言(0) 人氣()