Android NDK

原文地址:
http://developer.android.com/intl/zh-cn/tools/sdk/ndk/index.html#GetStarted

NDK是一个可以让你使用native-code语言比如c,c++来实现你app的一部分的一个工具集。对于某些类型的程序,这个是有帮助的,你可以重复使用这些语言编写的现有代码库,但是大多数应用程序并不需要Android NDK。

在下载NDK之前,你应该明白,NDK不会有助于大部分的应用程序。作为开发人员,你需要平衡它的优势和弊端。值得注意的是,在android上使用native code,一般不会导致特别期待的性能改进,但它会增加app的复杂性。一般情况下,只有app有必要,才会使用NDK。而不是因为你喜欢c/c++编程。

典型的使用NDK开发的是那些CPU工作比较频繁的,如游戏引擎,信号处理,物理模拟等,当你检查是否应该用native code开发时,想想你的需求,看看android框架API是否提供了你所需要的功能。

系统和软件要求


下面描述了系统和使用android NDK的软件需求,以及应用使用NDK的库对平台兼容性的影响。

The Android SDK
  • 一个完整的android sdk安装(包括所有依赖)是必须的。
  • android 1.5或更高的sdk版本。
支持的操作系统
  • Windows XP (32-bit) or Vista (32- or 64-bit)
  • Mac OS X 10.4.8 or later (x86 only)
  • Linux (32 or 64-bit; Ubuntu 8.04, or other Linux distributions using GLibc 2.7 or later)
所需的开发工具
  • 对于所有的开发平台,GNU设为3.81或更高版本。早期版本的GNU可能可以使用但是没有经过测试。
  • 还需要一个最新版本的awk(或GNU Awk或Nawk)。
  • 对windows平台,cygwin需要1.7或更高。NDK不会再Cygwin1.5上安装工作。
Android平台的兼容性
  • 通过android NDK创建的本地库只能运行在指定的最低android平台版本的设备上。要求的最低平台版本取决于你的目标设备的CPU架构。下表详细说明了android平台版本跟特定的CPU架构开发的native code兼容。
    Native Code CPU Architecture Used Compatible Android Platform(s)
    ARM, ARM-NEON Android 1.5 (API Level 3) and higher
    x86 Android 2.3 (API Level 9) and higher
    MIPS Android 2.3 (API Level 9) and higher

    这些要求意味着你使用的基于NDK开发的本地库的运行在android1.5或更高版本的设备上。如果要使用x86或者MIPS的本地库在你的设备上,你的应用必须针对android2.3或更高版本。

  • 为了确保兼容性,使用NDK开发的本地库的应用程序必须在清单文件中声明<uses-sdk>minSdkVersion属性为3或者更好,例如:
    <manifest>
      <uses-sdk android:minSdkVersion="3" />
      ...
    </manifest>
  • 如果你使用的NDK创建的本地库中使用了OpenGL ES APIs,应用包括这个库的应用程序可以运行在下表描述的最低版本的设备上。为了却确保兼容性,请确保你的应用程序声明了android:minSdkVersion属性,如下表所示:
  • OpenGL ES Version Used Compatible Android Platform(s) Required uses-sdk Attribute
    OpenGL ES 1.1 Android 1.6 (API Level 4) and higher android:minSdkVersion="4"
    OpenGL ES 2.0 Android 2.0 (API Level 5) and higher android:minSdkVersion="5"
  • 此外,使用OpenGL ES API的应用应该在清单文件声明<uses-feature>android:glEsVersion属性,指定应用程序所需的最小的OpenGL ES版本。这将确保Google Play将会只对能够支持你的应用程序的用户设备上显示。例如:
    <manifest>
    
      <uses-feature android:glEsVersion="0x00020000" />
      ...
    </manifest>
  • 如果你使用了NDK创建了一个使用API来访问android的位图像素缓冲区或本地的activity库,包含的应用程序只能部署到运行android2.2或更高版本的设备上。为了确保兼容性,请确保你的应用程序在清单文件声明<users-sdk android:minSdkVerison="8"/>属性。

安装 NDK


在你的开发计算机上安装NDK很简单,涉及从下载中提取NDK。


在你开始之前,确保你已经下载了最新的android sdk和升级了你的应用和环境变量。该NDK与旧版本平台兼容,但不是与旧版本的SDK工具兼容。此外,如果你还没有准备好,花一点时间来检查NDK需要的系统和软件要求。


要安装NDK,首先从表中下载相应的包。然后,根据你的开发平台,执行下面的程序:


在 Linux and Mac OS X (Darwin):
下载相应的包。
打开一个终端窗口。
打开你下载包所在的文件夹
在现在的软件包上运行 chmod a+x
执行包。例如:
ndk$ chmod a+x android-ndk-r10c-darwin-x86_64.bin
ndk$ ./android-ndk-r10c-darwin-x86_64.bin
          
在包含NDK的文件夹中提取
注意,你也可以使用一个像7z的解压包。
在 Windows:
下载相应的包。
打开你下载软件包的文件夹
双击下载的文件。包含NDK的文件夹中提取自己。
当未压缩时,NDK文件都包含一个名为android-ndk-<version>。如果有必要你可以重命名这个文件夹,你也可以把它移动到你电脑的任意位置。本文档指NDK目录。



NDK入门


一旦你成功安装NDK,花基本中阅读包含NDK的文档。你可以在<NDK>/docs/文件夹。特别是,请仔细于都本OVERVIEW.HTML文件,让你了解NDK的意图和如何使用它。


如果你使用的是以前版本的NDK,花点时间检查下NDK的变化,在CHANGES.HTML里。


这里是你怎么使用NDK工具工作的大概表述:

源码位置在<project>/jni/...
创建<project>/jni/Android.mk来描述你的本地源的NDK构建系统。
可选的:创建 <project>/jni/Application.mk.
通过在你的项目文件夹运行‘ndk-build’ 脚本来建立自己的本地代码。它位于NDK文件夹的顶部目录:
cd <project>
<ndk>/ndk-build
构建工具复制你的应用所需的库带应用程序项目木合适的位置。
最后,SDK工具用通用的方式来编译应用程序。该SDK构建工具将会把库部署到你的应用程序.apk的文件里。
有关上述所有步骤的完整信息,请参与附带的NDK包的文档。


使用 NDK

android框架提供了使用本地代码的两种方式:

采用了android框架编写应用程序,并使用JNI访问android NDK提供的API。这种技术可以让你的android框架发挥优势,而且仍然可以让你的在需要的时候编写本地代码。如果你使用这种方式,你的应用程序必须针对具体的,最小的android平台版本。更多信息请参考android平台的兼容性。


写一个本地的activity,它可以让你的本地代码实现activity的生命周期。它是通知任何activity的生命周期回调的本地代码的一个方便的类(onCreate(),onPause(),onResume()等)。你可以在你的本地代码中实现这些回调来处理这些事件当它们发生时。 应用程序使用native activity必须运行在android2.3或者更高的设备上。



NDK 的内容


该NDK包含的API,文档和示例应用程序帮助你来写你的本地代码。具体做法:

一组工具,使用c和c++来跟构建本地代码库文件。
一种可以嵌入相应的本地库到应用程序包文件(.apk文件)的方式,可以部署在android设备上。
一组本地系统头文件和库可以在android平台的所有未来版本运行,从android1.5kaishi ,使用本地activity必须运行在android2.3或更高的版本上。
文档,示例代码和教程。
该NDK的最高版本支持以下指令集:


ARMv5TE,包括 Thumb-1 的说明(见文档/CPU-ARCH-ABIS.html获取更多说明)。
ARMv7-A,包括 Thumb-2 和 VFPv3-D16 说明,与 NEON/VFPv3-D32的指令的可选支持(见文档/CPU-ARM-NEON.html 获取更多信息)
x86 说明 (见文档/CPU-X86.html  获取更多信息)
MIPS 说明(见文档/CPU-MIPS.html 获取更多信息)

ARMvTE机器代码将运行在所有基于ARM的Android设备上。ARMv7-A 仅在Verizon Droid或Google的Nexus One这种有一个 兼容CPU的设备上。两个指令集之间主要区别在于用ARMv-A支持硬件FPU,Thumb-2,和NEON指令。你可以使用一个或两个指令集--ARMv5TE是默认的,如果切换到ARMv7仅仅需要在Application.mk文件添加一行,而无需改变其他的任何文件。你也可以同时建立两个体系结构,把所有东西都存储到最后的final.apk。在NDK的CPU-ARCH-ABIS.HTML里提供了完整的信息。


该NDK提供了libc(C库),libm(Math library),OpenGL ES(3D图形库)的稳定的标头,JNI接口和其他库一样,在开发工具里列出。


开发工具


该NDK包含了一套交叉工具链(编译器,连接器等),可以在Linux,OS X,Windows(Cygwin)上产生本地ARM库。

它提供了一头系统的标头为保证在平台的所有后续版本,以支持稳定的本地API:



  • libc (C library) headers
  • libm (math library) headers
  • JNI interface headers
  • libz (Zlib compression) headers
  • liblog (Android logging) header
  • OpenGL ES 1.1 and OpenGL ES 2.0 (3D graphics libraries) headers
  • libjnigraphics (Pixel buffer access) header (for Android 2.2 and above).
  • A Minimal set of headers for C++ support
  • OpenSL ES native audio libraries
  • Android native application APIS

该NDK还提供了一个构建兄台那个,可以让你有效地与你的源代码工作,而无需处理工具链/平台/CPU/ABI的细节。创建很短的编译文件来描述编译那些源,那些android应用将要使用它们---构建系统编译完源代码并把库放到你项目工程的文件夹里。

Important: 除了上面列出的库,本地系统库在android平台是不稳定的,可能在未来的平台版本中有所改变。你的应用应只使用NDK提供的稳定的本地系统库。


文档

该NDK包中包含一组文档描述NDK的能力,怎么使用它来为你的应用创建库。在此版本中,该文档只在下载的NDK包中提供。你可以在<NDK>/DOCS/目录中查看。包括这些文件:

  • INSTALL.HTML — 介绍如何安装NDK并为你的主机系统配置它。
  • OVERVIEW.HTML —提供NDK的功能和使用的概述。
  • ANDROID-MK.HTML — 描述了Android.mk文件的使用,它定义了要编译的本地源代码
  • APPLICATION-MK.HTML — 描述了application.mk文件的使用,它定义了你的应用程序需要的本地源代码
  • CPLUSPLUS-SUPPORT.HTML — 在android NDK介绍了C++的支持
  • CPU-ARCH-ABIS.HTML — CPU架构以及怎么针对它们的介绍
  • CPU-FEATURES.HTML — 该cpufeatures静态库的说明,可以让你的应用程序代码探测目标设备。
  • CHANGES.HTML — 在所有版本更改NDK的完整列表。
  • DEVELOPMENT.HTML — 介绍如何修改NDK并声称发布包。
  • HOWTO.HTML — 关于与NDK开发相关的常见任务信息。
  • IMPORT-MODULE.HTML — 介绍如何共享和重用module。
  • LICENSES.HTML — 关于Android NDk的各种开源许可信息
  • NATIVE-ACTIVITY.HTML —介绍如何实现本地activities
  • NDK-BUILD.HTML — 介绍了 ndk-build 脚本的使用
  • NDK-GDB.HTML — 介绍怎么使用本地代码调试
  • PREBUILTS.HTML —介绍有关共享和静态预建库是如何工作的
  • STANDALONE-TOOLCHAIN.HTML —介绍了如何使用Android NDK工具链作为一个独立的编译器(处于测试阶段)
  • SYSTEM-ISSUES.HTML — 如果你正在使用NDK,你应该小心那些Android系统映像的已知问题。
  • STABLE-APIS.HTML —在NDK头部暴露的稳定的API的完整列表

此外,该套件包括有关提供android平台提供的“bionic”的C库的详细信息,如果你正在使用NDK开发,你可以在文档的<ndk>/docs/system/libc/目录:

  • OVERVIEW.HTML — 提供了"bionic"c库及它功能的概述

示例应用程序

NDK包括实例应用程序,说明如何使用本地代码在你的android应用中:

  • hello-jni —一个简单的应用程序加载从共享库实现的本地方法的字符串,然后再应用程序UI中显示
  • two-libs — 一个简单的应用程序,动态加载共享库并调用库提供的一个本地方法。在这种情况下,该方法是由共享库导入静态库中现实的。
  • san-angeles — 一个简单的应用程序,通过使用本地的OpenGL ES APIs渲染一个3D的图形,同时管理activity的生命周期与GLSurfaceView对象
  • hello-gl2 — 一个简单的应用程序,使用OpenGL ES2.0 vertex和fragment shaders渲染一个三角形。
  • hello-neon — 一个简单的应用程序,展示了如何使用cpufeatures库的NEON函数检查cpu在运行时的能力,如果CPU支持。具体而言,应用程序实现了两个微小差异的版本,C版本和NEON优化版本,支持它的设备的。
  • bitmap-plasma —一个简单的应用程序,掩饰如何使用本地代码来访问android Bitmap对象的像素缓冲区,并使用这个生成一个老式的"plasma"效果。
  • native-activity — 一个简单的应用程序演示了如何使用 native-app-glue静态库创建一个本地activity。
  • native-plasma — 一个通过实现本地activity的bitmap-plasma版本。

对于每个示例,NDK包含相应的C源码和必要的android.mk和application.mk文件,它们位于<ndk>/samples/<name>/和它们的源代码<ndk>/samples/<name>/jni/下。

你可以通过进入<ndk>/samples/<name>/ 构建共享库,然后调用 ndk-buildcommand. 生成的共享库会在 <ndk>/samples/<name>/libs/armeabi/ 对 (ARMv5TE 设备代码) 和/或 <ndk>/samples/<name>/libs/armeabi-v7a/ 对 (ARMv7 设备代码).

接下来,使用共享库建立android应用的示例:

  • 如果你正在使用Eclipse的ADT开发,使用新建项目向导来为每个例子创建Android工程,使用 "Import from Existing Source"选项导入 <ndk>/samples/<name>/的源码。然后,建立一个AVD,如果有必要,在模拟器上建立/运行应用.
  • 如果你正在使用Ant来开发,使用android工具为每个在<ndk>/samples/<name>/下为每个应用创建构建文件。然后,创建AVD,如果有必要,用常用的方式构建你的工程,在模拟器上运行它。

有关Android SDK开发工具,你需要的创建,构建和运行应用程序开发的更多详细信息,请参阅android开发的概述部分。

导出 hello-jni 示例

该hello-jin示例是一个简单的描述:怎么在android应用使用JNI。该HelloJni activity从C函数接受一个字符串并显示在TextView上。

该示例的主要组成部分包括:

  • android应用程序的基本结构(一个android清单文件,一个src和一个res文件夹,和一个主要的activity)
  • jni/ 目录包括本地代码实现的源文件以及android.mk文件
  • tests/ 目录包含测试文件
  1. 在eclipse里创建一个现有的示例的新项目或用android工具更新项目来产生一个可以构建示例的build.xml文件
    • 在 Eclipse:
      1. 点击 File > New Android Project...
      2. 选择 Create project from existing source 。
      3. 选择任何高于1.5的api。
      4. 在 Location 属性,点击 Browse... 然后,选择 <ndk-root>/samples/hello-jni 目录。
      5. 点击 Finish.
    • 在命令行:
      1. 切换到 <ndk-root>/samples/hello-jni 目录.
      2. 运行下面的命令来产生build.xml文件:
        android update project -p . -s
  2. 使用NDK-build命令来编译本地代码
    cd <ndk-root>/samples/hello-jni
    <ndk_root>/ndk-build
    
  3. 当做一个普通的andorid应用来构建和安装应用。如果你用的edlipse,运行应用在设备上构建和安装它。如果你用的Ant,在项目目录运行下面的命令:
    ant debug
    adb install bin/HelloJni-debug.apk
    

当你在设备上运行应用,Hello JNI就会出现在你的设备上。你可以导出位于<ndk-root>/samples目录的其他例子来演示怎么使用JNI。

导出native-activity示例应用

该Android NDK提供的native-activity示例演示了如何使用android_app_glue静态库。这种静态库更容易地创建一个本地activity通过在另一个线程里提供你需要实现的和处理你的回调,所以你不用担心阻塞主线程。示例的主要部分说明如下:

  • 熟悉的android应用基本结构 (一个 AndroidManifest.xml 文件, 一个 src/ 和 res 目录). 该 AndroidManifest.xml 声明该应用是一个本地的和指定的本地.so文件。 SeeNativeActivity 的源码请看<ndk_root>/platforms/samples/native-activity/AndroidManifest.xml 文件。
  • JNI/的目录结构包含本地activity,main.c,它们使用android_app_glue.h接口来实现activity。描述本地module来构建系统的android.mk也存在这里。

要构建这个示例应用:

  1. 在eclipse里从现有的示例里创建一个新的项目或用android工具更新工程来产生可以用来构建示例的build.xml文件
    • 在 Eclipse:
      1. 点击 File > New Android Project...
      2. 选择 Create project from existing source 。
      3. 选择高于2.3的api
      4. 在 Location 属性, 点击 Browse... 然后,选择 <ndk-root>/samples/native-activity 目录.
      5. 点击 Finish.
    • 在命令行:
      1. 切换到 <ndk-root>/samples/native-activity 目录。
      2. 运行下面命令来构建build.xml文件:
        android update project -p . -s
        
  2. 使用NDK-build命令来编译本地代码:
    cd <ndk-root>/platforms/samples/android-9/samples/native-activity
    <ndk_root>/ndk-build
    
  3. 当作一个普通的android 程序来建立和安装这个应用。如果你使用的eclipse,运行应用来建立和在设备上安装它。如果你使用的Ant,在项目目录运行下面的命令,然后,在设备上运行这个应用:
    ant debug
    adb install bin/NativeActivity-debug.apk
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值