编辑2016年7月26日——增加了下载网址,修改了一些错误。

  摸索了一周,走了很多弯路,磕磕绊绊,总算是弄好了NDK的开发环境,在这里总结一下吧。

一、Android NDK开发环境

   首先下载安装JRE、JDK,不必多说。然后下载NDK包,建议下载r11版本后的,自带C/C++的编译器, 不需要使用外部编译器的麻烦了,而且同时支持32位和64位的ARM处理器。下载完NDK包后,解压缩即可,需要之后关联到Eclipse。然后下载ADT Bundle,即安卓开发工具套装,里面集成好的Eclipse的安卓开发环境,但是,里面的版本可能较低而且没有集成NDK功能,下载新版的ADT包,进行更新。

  开发环境推荐下载网站:http://tools.android-studio.org/index.php

  关于SDK更新,由于长城防火墙的原因,导致无法更新SDK。可以进行如下设置,进行SDK更新。

  HTTP Proxy Server 设置为  mirrors.neusoft.edu.cn

  HTTP Proxy Port 设置为    80

  其他设置如下图

  设置好了之后进行Reload,然后选择需要的工具包进行安装。

  之后是ADT更新,下载最新的ADT包,然后在Eclipse的Help->Install New Software中进行离线更新,点击add弹出窗口,Name可以任意填写,location处单击Aarchive选择本地已经下载的adt插件。

  完成更新后,在Preferences中的Android这一栏里出现了NDK,选择后设置NDK的路径即可,路径设置到包含ndk-build.cmd文件的目录下,一般是ndk的根目录,或者根目录的build文件夹下。

  以上所有开发工具配置完成后,就可以进行期待的NDK开发了~~

二、运行NDK官方例子hello-jni

  首先导入hello-jni到工作空间中,File->Import,选择Existing Android Code Into Workspace,点击next,然后在Root Directory中浏览找到NDK文件夹下的samples下的hello-jni选中,然后如下图勾选,完成工程导入,整个工程就被复制到工作空间中了。

  导入后,可以在工程浏览窗口中看到工程结构,如下图

  右键这个工程,Android Tools->Add Native Support,进入后直接点完成即可。

  这样,我们就可以编译运行了。

三、编写自己的第一个一个NDK的应用

  我们将编写一个NDK应用,其功能是调用本地方法getNum(),获取一个整数,然后显示出来。

  首先新建工程,取名为MyFirstJni,我这里选择的最低API 16,其他的是API 19,其余默认设置,建立工程。

  之后在工程的MainActivity中,编写代码如下:

package com.pplxlee.myfirstjni;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); TextView tv = new TextView(this);
tv.setText(String.valueOf(getNum())); // 通过getNum方法得到int型数字,转换为Sting给tv
setContentView(tv); // 显示tv的内容
} private native int getNum(); // 声明Native方法getNum static {
System.loadLibrary("MyFirstJni"); // 载入动态链接库libMyFirstJni.so
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}

  然后右键工程,Android Tools->Add Native Support,进入后注意框里面的名字要和MainActivity的程序中加载的动态链接库的名字相同,这里输入"MyFirstJni"直接点完成即可。

  我们会看到产生了新的文件夹jni,并生成了文件MyFirstJni.cpp和Android.mk。MyFirstJni.cpp用于编写C++代码,去定义getNum()方法的具体实现过程,而Android.mk则描述了编译C++成库的方式。

  对比官方jni的例子,我们可以发现,我们还少了一个Application.mk,我们可以在我们工程里也加入这样的一个文件,文件内容为APP_ABI := all,这个文件使得编译器生成其支持的全平台的so文件,如果针对某一平台开发,可以具体设置。

  由于编写jni的C++代码有自己的规范,为了方便,可以通过jdk的javah工具,来自动生成头文件,方法如下。

  打开外部工具配置,新建工具javah4android,做如下设置(注意:Android JNI的生成配置和Java JNI的生成配置不同,无法混用):

Location:

  浏览jdk\bin目录,找到javah.exe

WorKing Directory:

  ${project_loc}

Arguments:      

  -v -classpath "${project_loc}/src"
  -d "${project_loc}/jni"
  -jni ${java_type_name}

设置完后选择应用。然后,在光标在MainActivity.java内的情况下,运行此工具。会看到在jni文件夹内生成了com_pplxlee_myfirstjni_MainActivity.h的文件。

  打开后可以看到代码如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_pplxlee_myfirstjni_MainActivity */ #ifndef _Included_com_pplxlee_myfirstjni_MainActivity
#define _Included_com_pplxlee_myfirstjni_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_pplxlee_myfirstjni_MainActivity
* Method: getNum
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_pplxlee_myfirstjni_MainActivity_getNum
(JNIEnv *, jobject); #ifdef __cplusplus
}
#endif
#endif

实际上就是声明了JNIEXPORT jint JNICALL Java_com_pplxlee_myfirstjni_MainActivity_getNum(JNIEnv *, jobject)函数,对应与java代码中的getNum函数,剩下的事情就是编码实现getNum的功能了。不过这里可能会出现Eclipse的bug,就是点击C++代码时,可能会产生类型不能解析的错误,导致无法编译运行。解决方法就是在编译运行之前删掉这些错误就好了。

  接下来编写MyFirstJni.cpp文件如下:

#include "com_pplxlee_myfirstjni_MainActivity.h"

jint Java_com_pplxlee_myfirstjni_MainActivity_getNum
(JNIEnv *,jobject) {
return ;
}

  然后编译运行,在手机上的运行结果如下:

  自此,一个简单的Android NDK程序完成了!

六、总结

  作为一个初学者,一定要静下心来一点一点的学习,切忌心浮气躁,会走很多弯路的!

  以后将学习如何在JNI中使用stl库和Opencv库等,学好后将会继续分享到我的博客上面。

  

Eclipse下Android的NDK开发环境配置的更多相关文章

  1. Google Android Studio Kotlin 开发环境配置

    Google 近日开发者大会宣布Kotlin成为Android开发的第一级语言,即Android官方开发语言,可见Google对Kotlin的重视,本文就介绍一下Android Studio下的Kot ...

  2. android Jni NDK开发环境搭建及其简单实例的编写

    android  Jni  NDK开发环境搭建及其简单实例的编写 由于工作需要,需要采用开发想要的JNI,由于之前没有接触过安卓的开发,所以更加网上的帖子,学习了下.遇到了些问题,然后总结下学习过程中 ...

  3. Android NDK学习(2)Windows下NDK开发环境配置

    转:http://www.cnblogs.com/fww330666557/archive/2012/12/14/2817386.html 一.配置好Android开发环境 二.下载安装安卓NDK   ...

  4. 【转】windows下 ADT NDK开发环境配置

    前提: 下载好Ecplise ADT并配置好开发环境,不会配置环境可以参考这里: http://blog.csdn.net/danfengw/article/details/47111107 步骤: ...

  5. Android之NDK开发环境r9

    需要的软件: android-ndk-r9-windows-x86_64.zip(我的系统是64位的,所以下载的是64的)下载地址:http://developer.android.com/tools ...

  6. cygwin选择安装包选项搭建NDK开发环境/配置cygwin的root权限

    9.Search是可以输入你要下载的包的名称,能够快速筛选出你要下载的包.那四个单选按钮是选择下边树的样式,默认就行,不用动.View默认是Category,建议改成full显示全部包再查,省的一些包 ...

  7. PHP5.6.23+Apache2.4.20+Eclipse for PHP 4.5开发环境配置

    一.Apache配置(以httpd-2.4.20-x64-vc14.zip为例)(http://www.apachelounge.com/download/) 1.安装运行库vc11和vc14 2.解 ...

  8. Android Studio NDK开发环境搭建

    一.   下载安装Android studio 和 NDK 二.   在Android studio中配置NDK(和SDK配置一样) 三.   用Android studio建立一个工程,打开proj ...

  9. 搭建Eclipse+ADT+Android SDK 安卓开发环境

    安装JDK 请看JDK环境搭建 即可. 安装Eclipse Eclipse 是一个开放源代码的.基于Java的可扩展开发平台.就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境.幸运 ...

随机推荐

  1. bzoj 4310 跳蚤——后缀数组+二分答案+贪心

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4310 答案有单调性? 二分出来一个子串,判断的时候需要满足那些字典序比它大的子串都不出现! ...

  2. 为什么中国出不了facebook和Twitter?

    我们坐拥全球最大基数的网民,我们拥有让人骄傲的四大发明,我们有有流传全世界的孙子兵法,可是在互联网时代,我们却落后了.互联网可以说是江山人才辈辈出,各领风骚三两年. 让我们来简单地回顾一下近几年的互联 ...

  3. xshell 使用密钥登录

    http://blog.csdn.net/suquan629/article/details/44783377

  4. file_put_contents(): supplied resource is not a valid stream resource

    在项目开发的过程中 自己想把输出和一些想要内容输出到日志文件中,便于查看 但是在输入的过程中报了这样一个错误: file_put_contents(): supplied resource is no ...

  5. git 本地文件里内容 操作记录

    本地环境文件合并分支(以下的都分别 commit提交了的) [一.分支[追加] 和 [新增] 新信息 合并主线  情景] 分支内容: dr.find_element_by_id("su&qu ...

  6. 【转】JMeter中使用Selenium进行测试

    JMeter是使用非常广泛的性能测试工具,而Selenium是ThroughtWorks 公司一个强大的开源Web 功能测试工具.Jmeter和Selenium结合使用,就可以实现对网站页面的自动化性 ...

  7. UEditor使用有感(红色),保存内容时,会自动添加p标签

    UEditor 介绍 UEditor 是由百度「FEX前端研发团队」开发的所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码. 1 入门部署 ...

  8. MFC学习(一) MFC基础类及其层次结构

    从类CCmdTarget派生出绝大多数MFC中的类,其层次结构如下图: 从根类Cobject层层派生出绝大多数MFC中的类,层次结构如下图: MFC中重点类: CObject类是MFC的绝大部分类的基 ...

  9. VMware虚拟机上网络连接模式bridged(桥接模式)

    VMware虚拟机上网络连接模式bridged(桥接模式)的实质就是虚拟机本身利用主机的网卡对外直接作为一个真实的物理主机存在. 也就是理论上此时的虚拟机和主机没什么关系,只是和主机公用了一块网卡,其 ...

  10. FB联网无人机取得重大进展 实现首次成功着陆

    科技讯6月30日消息,据Engadget报道,在过去的几年里,世界最大社交网络Facebook始终在测试其太阳能无人飞机Aquila.2016年6月份,这种联网无人机在美国亚利桑那州的尤马进行了首次全 ...