NDK的详细说明-来自官网
- 格式:doc
- 大小:39.00 KB
- 文档页数:6
Android NDK是一套工具,允许Android应用开发者嵌入从C和/或C + +源文件编译成自己的应用程序包本机代码。
重要提示:而Android NDK只能用于目标运行蛋糕(又名1.5)或更高版本的平台的Android系统映像。
1.0和1.1系统映像是专门不因细微的ABI和发生的1.5版本的工具链支持的变化。
一,Android的NDK目标:Android的虚拟机可以让您的应用程序的源代码来调用通过JNI实现本机代码的方法。
简而言之,这意味着:您的应用程序的源代码将宣布一个或多个方法的'本土'的关键字,以表明它们是通过本地代码实现的。
例如:原生的byte []的loadFile (字符串文件路径);你必须提供一个包含实施这些方法,这将被打包到应用程序的apk文件本机共享库。
这个库必须按照标准的Unix惯例被命名为lib.so ,并应包含一个标准的JNI入口点(后面将详细讨论)。
例如:libFileLoader.so您的应用程序必须显式地加载库。
例如,要加载它在应用程序启动时,只需添加以下到它的源代码:静态{System.loadLibrary (“FileLoader ”);}请注意,您不应该使用'解放'前缀和'所以'后缀在这里。
而Android NDK是一个补充,Android SDK中,可以帮助你:生成可以在Android 1.5平台上运行(和更高版本)在ARM CPU上运行JNI兼容的共享库。
生成的共享库复制到您的应用程序项目路径的正确位置,所以它们将被自动添加到您的最终(和符号)。
的apk在NDK的后续版本,我们希望能提供工具,帮助通过远程的gdb连接和尽可能多的源/符号信息尽可能调试您的本机代码。
此外,在Android NDK提供:一组交叉工具链(编译器,链接器等),可以产生在Linux,OS X和Windows原生的ARM二进制文件(使用Cygwin )一组对应的Android平台支持的稳定的原生API名单制头。
这相当于是保证在平台的所有版本中可能支持定义。
他们都记录在文件STABLE - APIS中重要提示:请记住,在大多数的Android系统映像的本地系统库中不冻结,可能会发生较大改变,甚至删除,在该平台的后续更新和发布。
构建系统,允许开发者只写很短的编译文件来描述其来源需要编译,以及如何。
构建系统处理所有的毛茸茸的工具链/平台/ CPU / ABI的细节。
此外,NDK的后续更新可以添加更多的工具链,平台,系统接口的支持,而无需改变开发人员的构建文件(后面将详细讨论)。
二。
Android的NDK非目标:NDK的是不写在Android设备上运行的通用原生代码的好方法。
特别是,您的应用程序仍然应该写在Java编程语言,处理Android系统事件适当地避免了“应用程序没有响应”对话框或处理的Android应用程序的生命周期。
然而要注意的是,可以在编写本地代码的复杂应用与用于启动/停止恰当的一小“应用程序包”。
JNI的一个很好的了解,强烈建议,因为在这种环境中的许多操作都需要从开发商的具体行动,这不一定是常见的典型的原生代码。
这些措施包括:不能够通过直接的本地指针直接访问VM对象的内容。
例如你不能安全地获得一个指向String对象的16位char数组来遍历它在一个循环。
需要明确参照管理时,本地代码要保持把手给JNI调用之间的VM对象。
NDK的只提供系统头文件为一组由Android平台支持的本机API和库的非常有限。
而一个典型的Android系统映像,包括许多本地共享库,这些都应该被认为是一个实现细节,可能会极大地改变和更新的平台版本之间。
如果Android系统的库没有明确的NDK头的支持,那么应用程序不应该依赖于它是可用的,或者他们在各种设备上的下一个过度的空气系统更新后,冒着打破。
选定的系统库将逐渐被添加到该组的稳定NDK的API。
三。
NDK的发展实践:下面是如何开发本机代码与Android NDK的一个非常粗略的概述:请将您的本地源在$ PROJECT / JNI / ...写$ PROJECT / JNI / Android.mk来描述你的源代码给NDK编译系统可选:写$ PROJECT / JNI / Application.mk来描述你的项目中更多的细节来构建系统。
你不需要一个拿到虽然起步,但是这可以让您针对多个CPU或覆盖的编译器/连接器选项(参见文档/应用程序MK.html的所有细节)。
通过运行在你的项目目录“$ NDK / NDK建造」,或任何其子目录中建立自己的本机代码。
最后一步将复制,在成功的情况下,剥离共享库的应用程序需要您的应用程序的根项目目录。
然后,您将需要通过正常的途径来产生最终的apk文件。
现在,对于一些细节:三.1 /配置NDK :以前的版本要求你运行'对build / host - setup.sh '脚本来配置你的NDK 。
这一步已在第4版(又名NDK R4)被完全去除。
2款/配C和C + +源代码:请将您的本地源在以下目录中:$ PROJECT / JNI /其中$项目对应于你的Android应用程序项目的路径。
你很自由,只要你想组织的“JNI ”的内容,目录名称和结构在这里将不会影响最终生成的应用程序包,所以你不必使用像融为一体<mycompany>伪唯一的名称。
<myproject>的是应用程序包名称的大小写。
需要注意的是C和C + +源代码的支持。
默认的C + +文件由NDK支持的扩展名是“。
CPP ',但其他扩展可以处理,以及(见ANDROID -MK详情)。
它可以通过调整你的Android.mk文件(见下文)来存储你的源代码在不同的位置。
三.3 /写一个Android.mk构建脚本:一个Android.mk文件是你写来描述你的源代码给NDK编译系统的小生成脚本。
它的语法细节上的文件ANDROID - MK在描述。
概括地说,NDK的群体的来源为“模块”,其中每个模块可以执行下列操作之一:静态库一个共享库你可以在一个Android.mk定义多个模块,或者你可以写几个Android.mk文件,每个文件定义一个单独的模块。
需要注意的是一个单一的Android.mk可能是由编译系统解析几次,所以不要认为某些变量没有在他们定义的。
默认情况下,NDK将寻找下构建脚本:$ PROJECT / JNI / Android.mk如果你想在子目录中定义Android.mk文件,你应该明确地将它们包含在您的顶级Android.mk 。
甚至有一个辅助函数来做到这一点,即使用:包括$ (调用所有子目录- makefile文件)这将包括在当前构建文件路径的子目录中的所有Android.mk文件。
三,4 /写一个Application.mk构建文件(可选):而一个Android.mk文件描述你的模块来构建系统,在Application.mk文件描述您的应用程序本身。
请参阅Application -MK文档以了解该文件允许你这样做。
这包括,但不限于:您的应用程序所需的功能模块的具体列表。
CPU体系结构(S)来生成机器代码。
可选信息,如是否要释放或调试版本,特定的C或C + +编译器标志和他人应适用于所有正在兴建的模块。
这个文件是可选:默认情况下,NDK将提供一个简单的构建都来自你的Android.mk中列出的模块(和所有它包含的makefile文件),并针对默认的CPU ABI (armeabi )。
有使用一个Application.mk两种方式:将其放置在$ PROJECT / JNI / Application.mk ,它会被自动拾取“NDK - 构建'脚本(后面将详细讨论)将其放置在$ NDK /应用程序/ <NAME> / Application.mk ,这里$ NDK指向你的NDK的安装路径。
在此之后,推出“makeAPP = ”距离NDK目录。
这是这个文件是Android的NDK R4之前使用的方式。
它仍然支持兼容性的原因,但我们强烈建议您使用第一种方法,而是因为它是非常简单的,并不需要修改/变更NDK安装树的目录。
再次,请参阅应用-MK对其内容的完整描述。
三,5 /调用NDK编译系统:首选的方式来建立机器代码与NDK是使用了Android NDK R4推出了“NDK - 构建'脚本。
您还可以使用第二个,传统,方法依赖于建立一个“$ NDK /应用程序”子目录中。
在这两种情况下,一个成功的构建将复制到您的应用程序的项目路径需要通过你的应用程序的最终剥离二进制模块(即共享库)(请注意,未剥开版本都保留用于调试目的,就没有必要对未移除的二进制文件复制到设备)。
1 :使用“NDK - 构建'命令:在' NDK - 构建'脚本位于NDK的安装路径的顶部可以直接从您的应用程序项目的目录中调用(例如:一个在您的AndroidManifest.xml所在地)或任何其子目录。
例如:CD $ PROJECT$ NDK / NDK建造这将启动NDK构建脚本,它会自动探测你的开发系统和应用程序的项目文件,以确定要建什么。
例如:NDK建造NDK - 构建清洁- >清洁生成二进制文件NDK - 建设- BV = 1 - >力完成重建,显示命令默认情况下,它预计在$ PROJECT / JNI / Application.mk一个可选的文件,以及需要$ PROJECT / JNI / Android.mk 。
如果成功,这将生成的二进制模块(即共享库)复制到你的项目树中的适当位置。
您可以稍后重新构建完整的Android应用程序包无论是通过平时的“蚁族”命令,或在ADT的Eclipse 插件。
看到NDK - BUILD获取这脚本的作用并选择它可以采取一个更完整的说明。
三.6 /指定自定义输出的目录:默认情况下,在$ PROJECT NDK - 建立地方所有的中间生成的文件/ OBJ 。
您可以通过定义NDK_OUT环境变量指向不同的目录然而选择不同的位置。
如果定义,该变量有两个作用:它确保了通常在$ PROJECT / OBJ去的所有文件都存储在$ NDK_OUT代替它讲述的,而不是$ PROJECT / obj的任何符号(即未剥开)版本生成的二进制文件的NDK - gdb来研究$ NDK_OUT 。
同样你可以通过定义NDK_LIBS_OUT到一个新的路径覆盖默认的$ PROJECT /库(图书馆和gdbserver的,等等)。
很少这样做,因为编译系统预计默认$ PROJECT /库/四。