




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
8步教你打开Android之门 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. #defineDEBUG_TAGNDK_AndroidNDK1SampleActivity 8. 9. voidJava_com_mamlambo_sample_ndk1_AndroidNDK1SampleActivity_helloLog(JNIEnv*env,jobjectthis,jstringlogThis) 10. 11. 12. 13. jbooleanisCopy; 14. 15. constchar*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 中定义的一样。每一部分都由一根下划线隔开,而不是点。该函数的头两个参数也很重要。第一个参数是 JNI 环境,它与 helper 函数会被频繁调用。第二个参数是该函数所属的 Java 对象。第 4 步:从 Java 中调用原生代码既然你已经写好了原生代码,让我们回头看看 Java 这边。在默认的 Activity 中,按照你的喜好创建一个按钮,并添加一个按钮处理器。从按钮处理器中,对 helloLog 作调用:23. helloLog(ThiswilllogtoLogCatviathenativecall.);然后你必须在 Java 这边添加函数声明。在你的 Activity 类中添加如下声明:24. privatenativevoidhelloLog(StringlogThis);它告诉编译和链接系统该方法将在原生代码中实现。最后,你需要加载原生代码最终编译到的库。在 Activity 类中添加如下的静态初始化程序来根据名称加载库(库的名字随你决定,在下一步还会用到):25. 26. 27. static 28. 29. System.loadLibrary(ndk1); 30. 31. 32. 第 5 步:添加原生代码的 Make 文件在 jni 文件夹中,现在你需要添加在编译中要用到的 makefile。该文件必须以“Android.mk”命名,如果你之前命名的文件为 native.c,库为 ndk1,那么 Android.mk 的内容就应该是这样:33. 34. 35. LOCAL_PATH:=$(callmy-dir) 36. 37. 38. 39. include$(CLEAR_VARS) 40. 41. 42. 43. LOCAL_LDLIBS:=-llog 44. 45. 46. 47. LOCAL_MODULE:=ndk1 48. 49. LOCAL_SRC_FILES:=native.c 50. 51. 52. 53. include$(BUILD_SHARED_LIBRARY) 54. 第 6 步:编译原生代码既然你的原生代码已完成,make 文件也已就绪,是时候编译原生代码了。在命令行下(Windows 用户在 Cygwin 下),你需要在你的项目的根目录下运行 ndk-build 命令。ndk-build 工具就在 NDK 工具目录中。将它添加到我们的路径中是最方便的办法。在之后的编译中,如果你使用“ndk-build clean”命令,那么你可以确保所有的东西都被重新编译了。第 7 步:运行代码现在你已准备妥当可以运行代码了。在你最喜欢的模拟器或者手持设备中载入该项目,查看 LogCat,然后点击按钮。可能有两件事情会发生。首先,它可能正常工作了。这样的话,恭喜你!不过你可能还是想要继续阅读下去。你也可能在 LogCat 中得到类似“Could not execute method of activity”这样的错误。这很正常。这只是说明你漏掉了某个步骤罢了。用 Eclipse 很容易发生这种情况。通常,Eclipse 被设置为自动重编译。如果它不知道有东西被修改了,它就不会自动重编译和重链接。在本例中,Eclipse 不知道你编译了原生代码。所以,“清除(cleaning)”该项目(在 Eclipse 工具栏中点击项目(Project)-清除(Clean),强制 Eclipse 重编译。第 8 步:添加另一个原生函数接下来的函数将不仅演示返回值的能力,还会演示返回例如字符串这样的对象的能力。在 native.c 中添加如下函数:1. jstringJava_com_mamlambo_sample_ndk1_AndroidNDK1SampleActivity_getString(JNIEnv*env,jobjectthis,jintvalue1,jintvalue2) 2. 3. char*szFormat=Thesumofthetwonumbersis:%i; 4. char*szResult; 5. /addthetwovalues 6. jlongsum=value1+value2; 7. /mallocroomfortheresultingstring 8. szResult=malloc(sizeof(szFormat)+20); 9. /standardsprintf 10. sprintf(szResult,szFormat,sum); 11. /getanobjectstring 12. jstringresult=(*env)-NewStringUTF(env,szResult); 13. /cleanup 14. free(szResult); 15. returnresult; 16. 17. 18. 为了正常编译,你会需要添加一个 include stdio.h 的声明。而且,为了响应这个新的原生函数,请在你的 Activity Java 类中添加如下声明:19. 20. privatenativeStringgetString(intvalue1,intvalue2); 你现在可以随意设定其功能。我们使用如下两个调用和输出:21. Stringresult=getString(5,2); 22. Log.v(DEBUG_TAG,Result:+result); 23. result=getString(105,1232); 24. Log.v(DEBUG_TAG,Result2:+result); 回到 C 语言函数中,你会注意到我们做了许多事情。首先,我们在使用 malloc() 函数中的 sprintf() 调用时需要创建一个缓冲器(buffer)。如果你不会忘记通过使用 free() 函数清理结果,那么这就很合理了。然后,为了传回结果,你可以使用一个叫作 NewStringUTF() 的 JNI helper 函数。该函数基本上就是获取一个 C 语言字符串,以之创建一个新的 Java 对象。这个新的字符串对象就可以在之后作为结果返回,你就可以在 Java 类中将它作为一个常规 Java 字符串对象使用了。指令集、兼容性,等等Android NDK 需要 Android SDK 1.5 或更高版本。在新版本的 NDK 中,有些新的头文件可用于扩大对某些 API 的访问特别是 OpenGL ES 库。不过,那些都不是我们要谈论的兼容性。这是原生代码,在使用时由处理器构架编译。因此,你要问自己的一个问题会是它支持何种处理器构架?在目前的 NDK 中(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 淡水鱼类资源保护与恢复技术考核试卷
- 2025年中考数学冲刺满分计划压轴集训测试二含答案
- 玻璃复合材料的界面设计与优化考核试卷
- 箱包行业质量管理体系认证考核试卷
- 社区食堂线上线下融合发展合作合同
- 北美数据中心建设监理与进度控制补充协议
- 网红面包区域代理合作协议及客户服务协议
- 企业员工情感账户管理与竞业禁止协议
- 环保材料研发工程师岗位聘用协议
- 油田钻井现场劳务派遣及安全培训合同
- 2024年烟台海阳市卫生健康局所属事业单位招聘工作人员真题
- 2025四川巴中市国有资本运营集团有限公司招聘17人笔试参考题库附带答案详解
- 2025神农科技集团有限公司第一批校园招聘17人(山西)笔试参考题库附带答案详解
- (快手、抖音、淘宝)主播兼职合同10篇
- 砍木伐木合同协议范本
- 延边大学教师岗位招聘考试真题2024
- 前厅服务与管理课件 处理客人投诉
- (二模)咸阳市2025年高三高考模拟检测(二)物理试卷(含答案)
- 科举制度的演变及认识 论文
- (2025)汉字听写大会竞赛题库(含答案)
- 20类重点场所火灾防范指导手册
评论
0/150
提交评论