在 Android 上,应用程序的开发,大部分基于 Java 语言来实现。要使用 c 或是 c++ 的程序或库,就需要使用 NDK 来实现。 NDK 是 Native Development Kit 的简称。它是一个工具集,集成了 Android 的交叉编译环境,并提供了一套比较方便的 Makefile ,可以帮助开发者快速开发 C 或是 C++ 的动态库,并自动的将 so 和 java 程序打包成 apk ,在 Android 上运行。
好,闲话少说,我们以一个简单的实例,来讲解 NDK 的应用。
一 开发环境的搭建
这一步虽然没什么技术含量,但是对于初学者,有一个很好的入门指导,还是很有帮助的。
1.1 Android SDK 的搭建
首先,要进行 Android 程序的开发, Android 的 SDK 是必须要安装的。当然, Java 环境也必不可少。我们先要安装 JDK 和 Eclipse ,这个可以选比较新的版本,因为 Android 新的 SDK 已经不支持旧版本了。
1.1.1 JDK 可以用 V5 或 V6 版本,下载地址 http://java.sun.com/javase/downloads/index.jsp
1.1.2 Eclipse 可以用版本 version 3.4 or 3.5 ,下载地址 http://www.eclipse.org/downloads/ . 当然,若你需要其他的 Java 开发环境,可以不用 Eclipse ,不过这样也就用不了 ADT(Android Development Tools) 插件了。推荐还是用 Eclipse 来进行开发比较好,毕竟比较权威和方便么。
1.1.3 安装 SDK
Android SDK 下载地址为 http://androidappdocs.appspot.com/sdk/tools-notes.html
1.1.4 为 Eclips 安装插件 ADT 。在 Eclipse 中,填加更新站点 https://dl-ssl.google.com/android/eclipse/ , 然后选择安装 ADT.
1.1.5 接下来,我们选择 Android 平台和组件。若是在 window 系统下,运行 SDK Setup.exe ;若是在 Linux 系统下,运行 tools 目录下的 android 程序,就可以选择需要的 Android Platform 和组件。
完成以上工作后,就可以进行 Android 应用程序的开发了。可以用 Eclipse 创建一个 Android 工程,比较简单的 Hello Android ,然后在模拟器下运行。具体的操作可以参看 Android 开发网站的说明,上面有详细的步骤。
1.2 Android NDK 的搭建
上面我们搭建好了 SDK 的环境,可以开发 Java 应用程序了。要开发 C 的程序,还得搭建 NDK 环境。
NDK 给我们提供了以下内容:
libc (C library) headers
libm (math library) headers
JNI interface headers
bz (Zlib compression) headers
blog (Android logging) header
A Minimal set of headers for C++ support
1.2.1 NDK 的安装
下载 NDK 安装包,下载地址 http://androidappdocs.appspot.com/sdk/ndk/index.html ,下载后解压即可使用。
1.2.2 若在 Linux 开发环境下那么,这样就可以使用了。若是在 window 环境下,还需要安装 cygwin 。 cygwin 下载地址: http://www.cygwin.com/
这样, NDK 的环境也搭建好了。下面我们来进行实战演习。
二 NDK 开发实例
关于 NDK 的使用,首先需要了解一个概念: JNI 。什么是 JNI ?
2.1 Hello-jni
这个是 NDK 自带的例子程序,安装官方网站的说明,一步步来,应该没有什么问题,这里就不细说了。
2.2 My God I did it
学习的第一步,就是模仿。我们依照上面 Hello-jni 的例子,在创建自己的 NDK 程序。在此过程中,对相关的内容和概念进行分析和说明。
首先,创建自己的 NDK 工程。我们在 ndk 的 sample 目录下创建自己的工程 myjni ,然后在这个文件夹子下,创建两个目录 jni 和 src , jni 用来放我们的 c 文件, src 是调用的 c 库 java 接口文件。创建好目录,接着创建文件 jni/myjni.c ,该文件比较简单,就是输出一个字符串,内容如下
#include <string.h>
#include <stdio.h>
#include <jni.h>
#include <android/log.h>
#define LOG_TAG "MYJNI"
#define LOGI(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
static char s_string[] = "My god, I did it!";
jstring
Java_com_jpf_myjni_MyJNI_stringFromJNI( JNIEnv* env,
jobject thiz )
{
LOGI("MyJNI is called!");
return (*env)->NewStringUTF(env, s_string);
}
这个程序,唯一和 hello-jni 不同的就是引用了 <android/log.h> 这个头文件。在该头文件中,声明了函数 __android_log_print(), 可以根据不同的 log 级别,输出 log ,方便代码的调试。在 NDK 中, printf() 没法输出,所以我们需要借助 log 库来将我们 c 代码库中需要输出的内容,通过 java 控制台输出。调用函数 __android_log_print(), 就可以在 Eclipse 中,查看 LogCat 来查看相关的输出信息了。
注意:
在 c 文件中,函数名这样定义: Java_com_jpf_myjni_MyJNI_stringFromJNI ,有什么讲究么?这个是 JNI 的标准,定义需要按照如下格式:
Java _packagename _classname _methodname ,
例如: Java _com_jpf_myjni _MyJNI _stringFromJNI
接着创建文件 jni/Android.mk. 这个文件是我们本地 c 代码的 Makefile 。文件内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := myjni
LOCAL_SRC_FILES := myjni.c
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)
分别对上述 Makefile 的语句进行说明。
LOCAL_PATH := $(call my-dir) 这句用来指定编译的路径。通过调用宏 my-dir ,获取到当前工作的路径。
include $(CLEAR_VARS) CLEAR_VARS 这个变量是编译系统提供的,用来指明一个 GNU makefile 文件,添加这句,主要的目的是清理所有的 LOCAL_XXX. ,比如 LOCAL_MODULE , LOCAL_LDLIBS 。在每个新模块的开始处,需要添加这句。
LOCAL_MODULE := myjni 这句定义了模块名称,将来编译的库就以此命名。若果编译的是动态库,那么库名就是 libmyjni.so. 需要注意的是,如果你定义 module 为 libmyjni ,那么系统在生成动态库的时候,就不要再为你添加 lib 的前缀了,生成德动态库名字还是 libmyjni.so.
LOCAL_LDLIBS += -llog 这句指定了需要另外链接的库。我们在代码中,用到了 log 库,所以这里加上这句。
include $(BUILD_SHARED_LIBRARY) 这句说明将来生产的库是共享库,及动态链接库。若需要生产静态库,可以这样写: include $(BUILD_STATIC_LIBRARY) 。
写完了 c 文件和 Makefile 文件,是否可以编译了呢?我们试一下。在 cygwin 中,进入工程目录,运行 ndk-build ,得到下面的结果:
Administrator@lenovo-0e47e162 /android/android-ndk-r4/samples/myndk
$ ndk-build
Android NDK: Could not find application's manifest from current directory.
Android NDK: Please ensure that you are inside the project's directory !
/android/android-ndk-r4/build/core/build-local.mk:74: *** Android NDK: Aborting
. Stop.
看到这个错误的意思是,缺少 manifest 文件。老版本的 NDk ,工程中有一个 apps ,里面包含了应用的程序文件和 Application.mk 。现在的版本,不需要我们自己编写 Application.mk, ,不过仍需要工程相关的配置信息。那么如何做到呢?需要手工去写 manifest 文件么?不需要。我们只需要在 Eclipse 中,创建工程就可以了,这些配置文件会自动生成。
前面讲过,在工程的 src 夹子下用来放置 Java 文件。我们打开 Eclipse ,然后新建一个 Android 工程,工程名就叫 MyJNI ,工程路径选择我们创建的 NDK 的路径。这里需要注意的是,工程名,包名等,需要和上面的 c 文件中的保持一致。
(Java
_com_jpf_myjni _MyJNI _stringFromJNI)
本文摘自:http://blog.csdn.net/L____J/article/details/5787759
分享到:
相关推荐
### Android开发手记一_NDK编程实例 #### 一、开发环境的搭建 在开始具体的NDK编程之前,首先需要确保开发环境已经被正确地搭建起来。对于初次接触Android NDK开发的朋友来说,拥有一个良好的环境配置是至关重要的...
这篇“Android开发手记--环境配置”主要介绍了如何在Windows XP环境下,利用MyEclipse进行Android开发的初始设置。 首先,你需要下载Android SDK。SDK(Software Development Kit)是Android开发的基础,包含了开发...
Android 开发手记 -- 环境配置 Android 开发手记是基于 Linux 内核的手机系统,使用 MyEclipse + Windows XP 作为开发工具,当然在 Linux 下开发是更好的选择。以下是 Android 开发环境配置的步骤: 第一步:下载 ...
Android应用开发精解 pdf 作 者: 高磊,杨诚,元凯 编著 ...本书适合有一定Java基础并且想要自学Android开发的编程爱好者、想要转行从事Android领域开发的程序员,以及正在从事Android的初学者阅读。
在Android开发领域,创建第一个应用程序是每个初学者的必经之路。这个过程涵盖了基础的环境配置、项目构建、布局设计以及程序逻辑编写等关键步骤。本文将基于"Android学习手记:第一个应用程序!"这一主题,结合源码...
ADT (Android Development Tools) 是Eclipse的一个插件,用于提供集成的Android开发环境。 ##### 在线安装 1. 打开Eclipse。 2. 通过菜单栏中的“Help”->“Install New Software...”打开安装新软件界面。 3. 在...
首先,源码的理解是Android开发中的关键。阅读和理解开源库或系统的源码,可以让我们更好地了解内部工作原理,从而更有效地解决问题。例如,当你在BrewClock项目中遇到计时器功能的问题,通过研究相关开源计时器的...
### Android Studio 开发环境搭建详解 #### 一、概述 随着移动互联网的飞速发展,Android平台已经成为全球最大的移动操作系统之一。为了满足开发者的需求,Google推出了Android Studio作为官方推荐的集成开发环境...
百度AR平台是百度公司推出的一系列增强现实(AR...整体来看,这篇实践手记是百度AR平台在Android开发中的一个实用指南,为开发者提供了从基础平台获取、到demo工程实践再到技术细节配置的全面指导,具有很高的实用价值。
在Android开发中,文件存储是一种常见的数据持久化方式,尤其适用于小型数据的保存,例如用户的手记应用。本文将详细解析如何使用文件存储在Android中实现一个简单的手记应用。 首先,我们来看`MainActivity.java`...
9. **移动开发**:Android 和 iOS 开发基础,包括 SDK 使用、UI 设计、性能优化和推送服务等。 10. **项目管理**:敏捷方法论(Scrum、Kanban)、项目规划工具(如 Jira、Trello),以及质量管理、风险管理等。 11...
通过《程序匠人手记网络版全篇》,读者不仅可以学习到具体的编程技术,还能了解到作为一名优秀的“匠人”,在软件开发过程中应具备的专业精神和综合能力。这份资料是程序员成长道路上的宝贵财富,值得长期参考和深入...
在Android开发中,通常会用到`Path`类来构建路径,包括直线、曲线等图形。动态曲线的实现可以通过计算每个时刻曲线的位置和形状,然后在`onDraw()`方法中更新`Canvas`上的绘制内容。开发者可能使用了`Path.lineTo()`...
在Android开发中,自定义视图是提升应用用户体验和视觉效果的重要手段。本文将深入探讨一个基于IDEA的Android工程源码示例,该示例实现了...如果你对Android开发有兴趣,研究这个示例源码将会是一个很好的学习途径。
ndroid 开发手记一 NDK编程实例
热更新技术是目前移动应用开发领域中一项非常重要的技术,它能够使开发者在不通过应用商店重新打包和更新应用的情况下,向已安装的用户提供新功能和修复漏洞。热更新技术的基本原理虽然相对简单,但要在大型和复杂的...
Unity3D是一种跨平台的游戏开发工具,支持多种操作系统,如Windows、MacOS等,并且能够发布到多个平台,包括PC、Web、iOS、Android等。它不仅为专业游戏开发者提供了一个高效的开发环境,还为初学者提供了一套易上手...
Java的跨平台特性使得开发者可以编写一次代码,到处运行,这在Android开发中意味着应用可以在多种不同配置的Android设备上运行。使用Java进行开发,还意味着开发人员可以利用丰富的开源库和工具,提高开发效率和应用...
BookieZilla开发手记 项目功能 最近在做一个旧书交易网站,本属于B/S体系结构的课程作业,但由于采用了新的框架所以跃跃欲试想都记录下来。 实现一个旧书交易网站,基本功能如下: 实现用户注册、登录功能,用户注册...