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

到官网www.cygwin.com单击左边“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

分类: Android NDK

更多相关文章

  1. Android利用SAX解析XML文件
  2. 三种安卓模拟器的安装和比较
  3. Android(安卓)HttpURLConnection及HttpClient选择
  4. Android开发5――文件读写
  5. Android的SDK,NDK以及JNI
  6. android 获取uri的正确文件路径的办法
  7. android 手机存储介质大全
  8. Pycharm安装PyQt5的详细教程
  9. NPM 和webpack 的基础使用

随机推荐

  1. SQL Server的通用分页存储过程 未使用游
  2. Sql function 多行中的列合并为一行一列
  3. 一段压缩MS SQLServer日志的语句
  4. sqlserver 临时表的用法
  5. sqlserver中更改数据库所属为dbo的方法
  6. SQLServer更改sa用户名的方法
  7. 利用脚本自动安装SQLServer的实现步骤分
  8. 一个基于ROW_NUMBER()的通用分页存储过程
  9. MSSQL 将截断字符串或二进制数据问题的解
  10. 通过SQLSERVER重启SQLSERVER服务和计算机