∙ 8步教你打开Androidandroid学习教程之门 NDK入门教程
这是一篇Android NDK开发的入门教程,在这一教程结束后,你将创建你自己的项目,从Java代码简单地调用原生C语言代码。
前不久我们为大家介绍过在MyEclipse 8.6上搭建Android开发环境,本文为一篇外文翻译,我们将介绍如何学习安装 Android NDK 并开始使用它。在这一教程结束后,你将创建你自己的项目,从 Java 代码简单地调用原生 C 语言代码。
教程细节
技术:Android SDK、NDK、C 语言
难度:进阶
预计完成时间:60-90 分钟
先决经验
在我们开始之前,我们需要先花点时间了解一下这一教程的难度。它的标记是“进阶”。之所以标为“进阶”是因为我们这些作者想要确保你符合以下要求:
你有Java和C语言经验。
你能适应命令行操作。
你知道如何了解你的 Cygwin、awk 和其他工具的版本。
你能适应 Android Development。
你有一个有效的 Android 开发环境(本文撰写时,笔者使用的是 Android 2.2)
你使用 Eclipse 或者可以将 Eclipse 的指导步骤轻松应用于你自己的 IDE 上。
就算你并不满足这些条件,我们当然也欢迎你阅读这一教程,不过你可能在某些步骤遇到困难,如果你满足了以上条件这些困难就会轻易解除。也就是说,即使你认为自己是个移动开发老手,使用 NDK 依然很容易碰到困难和麻烦。请注意你可能要自行排查故障才能让一切正常运转于你的开发系统中。
本教程提供完整的样例项目的开源代码下载。
何时使用 NDK 的说明
好,如果你正在阅读这篇教程,你也许已经在考虑在你的 Android 项目中使用 NDK 了。不过,我们想要花点时间讨论一下 NDK 为什么那么重要、何时该使用它,以及——同等重要的,何时不该使用它。
总的来说,只有当你的应用程序真的是个处理器杀手的时候你才需要使用 NDK。也就是说,你设计的算法要利用 DalvikVM 中所有的处理器资源,而且原生运行较为有利。还有,别忘了在 Android 2.2 中,JIT 编译器会提高类似代码的效率。
另一个使用 NDK 的原因是方便移植。如果你在现有的应用程序中有大量的 C 语言代码,那么使用 NDK 不仅可以加速你的项目的开发进程,也能在你的 Android 和非 Android 项目中保持修改的同步。这一点对于那些为其他平台而写的 OpenGL ES 应用程序来说尤为如此。
别以为只要用了原生代码就能提高你的应用程序的效率。Java 与原生 C 语言之间的转换会
增加一些资源开销,因此只有你有一些集中消耗处理器资源的任务时才真正有必要这么做。
第 0 步:下载工具
好了,让我们开始吧。你需要下载 NDK。我们先开始下载,因为在下载的过程中你可以检查一下确保你所需要用到的其余工具的版本都正确。
从 Android 网站下载适合你的操作系统的 NDK。
现在,对照下列检查你的工具版本:
如果在 Windows 下,Cygwin 1.7 或更高版本
将 awk 升级到最新版本(我们使用的是 20070501)
GNU Make 3.81 或更高版本(我们使用的是 3.81)
如果其中任何一个的版本太旧,请在继续之前先升级。
第 1 步:安装 NDK
既然 NDK 已经下载完成(没错吧?),你就需要解压缩它。解压后将它放入合适的目录中。我们把它放在和 Android SDK 相同的目录下。记住你把它放在哪里了。
现在,你也许想要在路径设置中添加 NDK 工具。如果你在 Mac 或 Linux 下,你可以用你的原生路径设置来完成。如果你在 Windows 下的 Cygwin,你就需要设置 Cygwin 的路径设置。
第 2 步:创建项目
创建一个常规的 Android 项目。为了避免日后的问题,你的项目的路径必须不包含空格。我们的项目有个叫做“com.mamlambo.sample.ndk1”的包,带有一个叫做“AndroidNDK1SampleActivity”的默认 Activity——你之后还会看到它们。
在这个项目的顶层创建一个叫做“jni”的目录——这是你放置原生代码的地方。如果你很熟悉 JNI,那你就会知道 Android NDK 很大程度上基于 JNI 的概念——它本质上是个只有有限的 C 语言编译头文件的 JNI。
第 3 步:添加一些 C 语言代码
现在,在 jni 文件夹中,创建一个叫做 native.c 的文件。一开始将以下 C 语言代码写入该文件,我们以后再添加另一个函数:
1. #include
2.
3. #include
4.
5. #include
6.
7. #define DEBUG_TAG "NDK_AndroidNDK1SampleActivity"
8.
9. void Java_com_mamlambo_sample_ndk1_AndroidNDK1SampleActivity_helloLog(JNIEnv * env, jobject this, jstring logThis)
10.
11. {
12.
13. jboolean isCopy;
14.
15. const char * szLogThis = (*env)->GetStringUTFChars(env, logThis, &isCopy);
16.
17. __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:LC: [%s]", szLogThis);
18.
19. (*env)->ReleaseStringUTFChars(env, logThis, szLogThis);
20.
21. }
22.
这个函数实际上非常浅显。它获取一个 Java 对象的字符串参数,将它转换为 C-string,然后将它写入到 LogCat 中。
不过该函数的名字很重要。它遵循了以“Java”的特定字样开头,后面跟着包名称,然后类名称,然后方法名称,和 Java 中定义的一样。每一部分都由一根下划线隔开,而不是点。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论