Android ndk 开发环境搭建 和 示例

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-r8b
export 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值