【官网翻译】android NDK

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

概述
NDK是一个工具集,可以允许你使用诸如c/c++这些机器本地语言来编写你的应用程序的某些部分。对于有些特定类型的应用,你可以重复使用这些语言编写的现有代码库,但大多数的android应用程序并不需要Android NDK。

在下载NDK的之前,你应该明白NDK对大多数应用程序没有用处,作为开发人员,你应当平衡比较它的优势和弊端。值得注意的是,使用android原生代码,一般不会导致明显的性能改进,但总是增加你的应用程序的复杂性。一般情况下,只有在有必要的时候使用NDK,而不是因为你喜欢使用c/c++编程。

使用NDK的典型场景是CPU密集型工作负载的程序,比如游戏引擎,信号处理,物理模拟等等。当使用NDK写作本地代码的时候,想想你的需求,看看Android框架API已经提供给你需要的功能

省略翻译“下载”和“版本”两个章节,请读者自行阅读

系统和软件需求
下面章节描述了使用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 Make 3.81或者更晚的版本. 更早的版本也许可以工作但没有被测试过。
  • 一个近期版本的awk (either GNU Awk or Nawk)。
  • 对于Windows平台,需要 Cygwin 1.7或者更高的版本。如果使用Cygwin 1.5,NDK将不会工作
Android平台兼容性
Android NDK创建的本地库只能运行特定的最小的Android平台版本。要求的最低平台版本取决于你的目标设备的CPU架构,下图展示了相关的细节。



为了确保兼容性,使用NDK之前必须在清单文件中声明<uses-sdk>元素,设置 android:minSdkVersion属性值,例如:
<manifest>
  <uses-sdk android:minSdkVersion="3" />
  ...
</manifest>
</pre>如果你使用NDK创建一个本地库来使用OpenGL ES APIs,则必须按如下图声明最小版本</div><div dir="ltr"><span style="font-size:18px"><img src="https://img-blog.csdn.net/20141216162030843" alt="" /></span></div><div dir="ltr"><span style="font-size:18px">此外,使用OpenGL ES API必须在清单文件中声明<uses-feature>元素,使用android:glEsVersion属性来指定最小的OpenGL ES版本,这将确保谷歌只会对支持你应用的设备播放你的应用程序,如下</span></div><div dir="ltr"><span style="font-size:18px"></span><pre name="code" class="html"><manifest>

  <uses-feature android:glEsVersion="0x00020000" />
  ...
</manifest>
如果你使用NDK创建一个本地库来使用API访问Android位图像素缓冲区或者本地Activity。包含库的应用程序只能部署到运行Android2.2(API 8)或者更高版本的设备,为了确保兼容性,请在你的应用程序清单文件中使用<use-sdk android:minSdkVersion="8">属性

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

在你开始之前,首先确保你下载了最新的Android SDK和升级了应用程序和环境。NDK是与旧版本的平台兼容,但不是和旧版本的SDK工具兼容。此外,花一点时间来审查是否符合NDK的系统和软件要求。

要安装NDK,首先下载适合你开发平台相关的包

Linux and Mac OS X (Darwin):
1、下载相关的包
2、打开一个终端窗口
3、进入你的下载包的目录
4、在你下载的包上运行 chmod a+x
5、执行包,例如:
ndk$ chmod a+x android-ndk-r10c-darwin-x86_64.bin
ndk$ ./android-ndk-r10c-darwin-x86_64.bin
          

windows
1、下载相应的包
2、导航到你下载包的文件夹
3、双击下载的文件,从NDK的文件夹中提取本身

当未被压缩的时候,NDK文件都包含一个名为Android-ndk-<version>的目录。如有必要可以重新命名NDK目录,你可以将它移动到电脑的任何位置。好的,现在可以开始NDK的工作。

NDK入门
一旦你成功安装NDK,花几分钟阅读包含在NDK中的文档,你可以在<NDK>/docs/directory中找到这个文件。特别请阅读OVERVIEW.html(译者注:新版没看见这个html,看见一个starthere的文档),让你了解NDK的意图和如何使用它

如果你使用以前版本的NDK,花点时间审查NDK的变化,在change.html文件中。

这是你的NDK工作的大致框架
1、放置你的native代码在<项目>/jni/文件夹下面
2、创建<项目>/jni/Android.mk来对NDK系统描述你的本地代码
3、可选:创建<项目>/jni/Application.mk
4、通过运行‘ndk-build’脚本来创建你项目目录中的本地代码,它位于NDK的顶层目录
cd <project>
<ndk>/ndk-build
构建工具会复制共享库到你的应用程序需要的适当位置
5、最后,使用sdk工具像往常一样编译你的应用程序,该sdk构建工具会将共享库打包到apk文件中

使用NDK
Android的框架层提供了两种方式来使用native代码
1、采用Android框架编写应用程序,并使用JNI来访问Android NDK提供的API。这种技术可以发挥Android框架的便利优势,但仍然有可能让你编写native代码。如果使用这种方式,你的应用程序必须针对具体的,最小的Android平台。
2、写一个native Activity,它可以让你实现在native代码中生命周期回调。Android SDK提供了NativeActivity类,这个类提供了方便的本地代码生命周期回调(onCreate(),onPause(),onResume()等等)。你可以在你的native代码中实现这些回调来处理事件。使用这种方式必须在Android2.3(API 9)以及更高的版本上运行。你不能访问诸如Service和Content Providers,如果你想使用它们或者任何其他的框架,你仍然可以编写JNI代码。

NDK的内容
NDK包含APIs,文档,和应用例子,来帮助你写你的native代码,具体的:
  • 一组构建c/c++源码到native代码库的工具
  • 一种把native库嵌入到应用程序包文件(apk文件)的方法
  • 一组将在所有的Android未来版本都支持的原生系统头文件和库,从Android1.5开始,使用native Acitivity将从Android2.3或者更高版本开始
  • 文档,示例和教程
NDk的最新版本支持以下指令集:
  • ARMv5TE,包括Thumb- 1的说明
  • ARMv7 -A ,其中包括Thumb- 2和VFPv3 -D16的指令,与NEON / VFPv3的- D32的指令可选支持
  • x86指令
  • MIPS指令
用ARMv5TE的机器代码将运行于所有基于ARM的Android设备。ARMv7-A仅在诸如Version Droid或者谷歌的Nexus One兼容的CPU设备上运行

NDK提供一个文档的libc的头文件(c库),libm(数学库),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程序将使用它们——构建系统将编译这些源,并将编译得到的共享库直接放入应用程序的项目中

重要提示:除了上面这些库,Android系统还有一些不稳定的库,可能在未来的平台版本中会改变。所以你的应用程序只应利用这个NDK提供的稳定的原生系统库

文档一章不翻译了,发现有些不一样的地方

示例应用程序
NDK包括的示例应用程序,说明如何在你的应用程序中使用native代码

  • hello-jni — 一个简单的应用程序,加载用native方法实现的共享库中的字符串,然后在应用程序中显示出来。
  • two-libs — 一个简单的应用程序,动态加载共享库并调用库提供的一个native方法,在这种情况下,该方法是由共享库导入静态库中实现的。
  • san-angeles — 一个简单的应用程序,通过调用native OpenGL ES APIs 实现用GLSurfaceView object来管理活动的生命周期。
  • hello-gl2 — 一个简单的应用程序,使用OpenGL ES2.0呈现三角形
  • hello-neon — 一个简单的应用程序,展示如何使用cpufeatures库检测CPU在运行时的功能。具体而言,应用程序实现了两个版本,c版本和NEON优化版本(如果设备支持)
  • bitmap-plasma — 一个简单的应用程序,演示如何通过native代码访问Android Bitmap对象的像素缓冲区,并使用此生成一个“等离子”效果。
  • native-activity — 一个简单的应用程序,演示如何通过native静态库创建一个native Activity
  • native-plasma — 另一个版本的等离子位图,通过natice Activity来实现
对于每一个例子,NDK包含相应的c源码和必要的Android.mk和Application.mk文件。都位于<ndk>/samples/<name>/目录中,源码可以在<ndk>/samples/<name>/jni/目录中发现

通过调用ndk-build命令,你可以为示例应用创建共享库,一般生成的共享库位于<ndk>/samples/<name>/libs/

接下来,创建使用共享库的样例Android应用程序

如果你使用Eclipse ADT开发,使用“导入项目”为每个例子创建一个新的Android工程,从<ndk>/samples/<name>/目录导入源文件,启动AVD,在模拟器中运行应用
如果你使用ant来开发,在每个示例<ndk>/samples/<name>/中使用android工具创建一个构造文件,然后运行AVD,在模拟器中运行它。

探索hello-jni示例
hello-jni是一个简单应用程序,从一个c函数接收一个字符串并用textview显示出来。
该示例的主要组成包括:
  • android应用程序的基本结构(包括AndroidManifest.xml文件,一个src/res目录,以及一个main Activity)
  • jni/目录,其中包括native代码实现的源文件和Android.mk文件
  • 一个test/目录包含单元测试代码

1、在eclispe内
  • 点击 File > New Android Project...
  • 选择从已有的源中创建项目
  • 选择任何大于1.5的Android APi
  • 选择 <ndk-root>/samples/hello-jni 目录.
  • 完成
2、使用命令行
  • 导航到<ndk-root>/samples/hello-jni目录
  • 运行一下命令行创建build.xml
android update project -p . -s
  • 使用ndk-build编译native代码
cd <ndk-root>/samples/hello-jni
<ndk_root>/ndk-build

建立和安装应用程序,如果你使用eclipse,运行应用程序,以构建和在设备上安装。
如果你使用Ant,请使用以下命令
ant debug
adb install bin/HelloJni-debug.apk

后面的native-Activity项目类似



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章