本文共 3666 字,大约阅读时间需要 12 分钟。
Android系统中的应用程序都是用Java开发的。Android NDK使我们能够在android上使用C/C++开发的原生代码。
有两个理由使用NDK: 一是合理的重用现有的代码;二是在程序中某些关键的部分提高执行效率。
使用Android NDK开发,除了普通Android开发环境外,还需要下载NDK包 和 安装Cygwin工具(windows环境下需要)。
Cygwin
Cygwin 是 Windows 上类似于 Linux 的环境。它包括一个提供 UNIX 功能性基本子集的 DLL 以及在这之上的一组工具。(所以在linux下不需要使用)
安装Cygwin的步骤如下:
1.下载setup.exe
到官网 单击左边 “Install Cygwin”。再点击中间“Setup.exe”这将下载一个小程序 setup.exe(250KB)。
这个安装程序将在您的机器上引导 Cygwin 环境的安装或更新过程。
2.运行setup.exe,进行安装,如下图:
图 1. Cygwin 环境的安装向导点击 Next按钮。
选择下载位置 在这个页面上,选择"Install from Internet"。图 2. 选择安装类型
一直点击 Next按钮,一直到出现下图界面:
选择一个下载站点。因为这些站点是义务的镜像,所以选择一个下载点有点风险(通常它们是可用的,但有时不可用)。通常,试试离你比较近的那个站点。(有一个http://mirrors.163.com最快)点击 Next按钮。
选择包进行安装 在这个页面上,您将选择要安装的包。默认情况下,Cygwin 基本包将不安装 GCC,因此,您必须修改默认设置。 将鼠标移动到 Devel边的加号(+)上,然后点击它展开 Devel类。这一步,我们选择需要下载安装的组件包,为了使我们安装的Cygwin能够编译程序,我们需要安装gcc编译器,默认情况下,gcc并不会被安装,我们需要选中它来安装。为了安装gcc,我们用鼠标点开组件列表中的“Devel”分支,在该分支下,有很多组件,我们必须的是:
binutils gcc gcc-mingw gdb
make
鼠标点击组件前面的循环按钮,会出现组建的版本日期,我们选择最新的版本安装,下图是选中后的四类组件的截图:
binutils组件
gcc组件
如果gcc-mingw-core和gcc-mingw-g++找不到:就找mingw-gcc-core和mingw-gcc-g++
gcc-mingw组件
gdb组件
make组件
选完以后,我们选择下一步,进入安装过程,如下图所示,
一直到下载完成,选择在桌面上建快捷方式,就ok了!
3.测试是否安装成功
运行cygwin,输入make -v 和 gcc -v 如果能找的,则表示安装成功。
安装NDK
安装ndk很简单,网上随便搜一下,只需要把下载的ndk文件解压缩到自已指定的目录即可。(如:我的路径为E:\android-ndk-r8b)
配置NDk
修改Cygwin目录(我的默认装在C:/cygwin/home/Administrator/.bash_profile文件,在文件末尾加入如下代码:
NDKROOT=/cygdrive/ndk文件的路径export NDK_ROOT (例如我的如下:
NDKROOT=/cygdrive/e/android-ndk-r8bexport NDKROOT)
(注意:NDKROOT名字可以自己起,ndk文件路径是你 解压缩后ndk的路径,特别注意将斜杠换成反斜杠 和 去掉d:中的:(windows和linux路径区别问题))
五、 用 NDK 来编译程序
a.现在我们用安装好的 NDK 来编译一个简单的程序吧,我们选择 ndk 自带的例子 hello-jni ,我的位于E:\android-ndk-r6b\samples\hello-jni( 根据你具体的安装位置而定 ) , b.运行 cygwin ,输入命令 cd /cygdrive/e/android-ndk-r6b/samples/hello-jni ,进入到 E:\android-ndk-r6b\ samples\hello-jni 目录。 c.输入$ $NDK_ROOT/ndk-build (一定要在你需要编译的程序的目录下运行$NDK_ROOT /ndk-build,因为是 使用NDK编译你需要的工程,编译时会在你所在工程的jni目录找Android.mk文件来确定需要编译的文件),执行成功后, 它会自动生成一个 libs 目录,把编译生成的 .so 文件放在里面。 ($NDK_ROOT是调用我们之前配置好的环境变 量, ndk-build 是调用 ndk 的编译程序 ) d.此时去 hello-jni 的 libs 目录下看有没有生成的 .so 文件,如果有,你的 ndk 就运行正常啦!六、自己开发一个NDK程序样例:
a.在eclipse中新建一个android工程,命名为NDKTest,新建一个Jni.java文件:
package com.zy.ndktest; public class Jni { public native int getInt(); public native String getString (); } jni文件中除了native方法,还可以有java写的方法. b.使用javah生成.h文件: 首先运行android程序以便编译生成class文件 打开cmd命令行窗口,进入项目的bin\classes 目录(如:cd D:\Eclipse\workspace\NDKTest\bin\classes) 运行javah -classpath . -jni com.zy.ndktest.Jni 会在 classes 目录下自动生成一个com_zy_ndktest_Jni.h文件 c.使用C语言实现本地方法 首先在项目目录中新建一个jni目录,再建com_zy_ndktest_Jni.c文件(实现com_zy_ndktest_Jni.h 中的2个 方法) #include <stdio.h> #include <stdlib.h> #include <jni.h> int add2(){ int x,y; x=1000; y=8989; x+=y; return x; } JNIEXPORT jint JNICALL Java_com_zy_ndktest_Jni_getInt (JNIEnv *env, jobject thiz){ return add2(); } JNIEXPORT jstring JNICALL Java_com_zy_ndktest_Jni_getString (JNIEnv *env, jobject thiz){ return (*env)->NewString UTF(env," HelloNDK----philn"); } d.在jni下建立一个 Android.mk 文件,写入: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := NDKTest LOCAL_SRC_FILES := com_zy_ndktest_Jni.c include $(BUILD_SHARED_LIBRARY) e.使用cygwin进入项目文件夹: $ cd /cygdrive/d/Eclipse/workspace/NDKTest(我的NDKTest项目文件夹是:d/Eclipse/workspace/NDKTest) 运行命令: $ $NDKROOT/ndk-build.cmd 在该项目下会自动生成libs\armeabi\libNDKTest.so文件 f. MainActivity中调用: public class MainActivity extends Activity { static{ System.loadLibrary("NDKTest"); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Jni jni = new Jni(); TextView textView = new TextView(this); textView.setText(jni.getString ()+":::"+jni.getInt()); setContentView(textView); } } 6.运行应用,可以看的出如下的效果HelloNDK----philn:::9989