博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Eclipse下Android的NDK开发环境配置
阅读量:5795 次
发布时间:2019-06-18

本文共 4417 字,大约阅读时间需要 14 分钟。

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

 

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

一、Android NDK开发环境

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

  开发环境推荐下载网站:

  关于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 
/* Header for class com_pplxlee_myfirstjni_MainActivity */#ifndef _Included_com_pplxlee_myfirstjni_MainActivity#define _Included_com_pplxlee_myfirstjni_MainActivity#ifdef __cplusplusextern "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 100;}

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

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

六、总结

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

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

  

转载于:https://www.cnblogs.com/pplxlee/p/5559223.html

你可能感兴趣的文章
C/C++编程可用的Linux自带工具
查看>>
三种数据分析法提升电商运营
查看>>
哪个线程执行 CompletableFuture’s tasks 和 callbacks?
查看>>
《数据科学与大数据分析——数据的发现 分析 可视化与表示》一2.10 练习
查看>>
Oracle ASM 翻译系列第六弹:高级知识 如何映射asmlib管理的盘到它对应的设备名...
查看>>
多线程之volatile关键字
查看>>
如何判断webview是不是滑到底部
查看>>
Raptor实践2——控制结构
查看>>
Smartisan OS一步之自定义拖拽内容
查看>>
海贼王十大悲催人物
查看>>
org.hibernate.MappingException: No Dialect mapping for JDBC type: -1 搞定!
查看>>
热点热词新闻资讯API开放接口(永久免费开放)
查看>>
【第二章】 IoC 之 2.2 IoC 容器基本原理 —— 跟我学Spring3
查看>>
8.1_Linux习题和作业
查看>>
我的友情链接
查看>>
11.排序算法_6_归并排序
查看>>
Redis redis-cli 命令列表
查看>>
.NET框架设计—常被忽视的框架设计技巧
查看>>
ios中摄像头/相册获取图片,压缩图片,上传服务器方法总结
查看>>
BigDecimal 舍入模式(Rounding mode)介绍
查看>>