android的NDK安装及工程实例

来源:互联网 发布:淘宝手编毛衣外套 编辑:程序博客网 时间:2024/05/16 10:44

本文有些转载,分结合自己试验所得。

本文操作系统win7 64位, DNK r10版本

1)打开Android开发者的官网 http://developer.android.com/ 找到Develop点击。如果页面打不开,通过代理来访问。


2)本人下载64位的DNK,解压下载的android-ndk32-r10-windows-x86_64.zip,将其放到你想要的目录下。

注:R7之前的版本,必须要安装Cygwin才能使用NDK。从R7开始,Windows版本的NDK提供了一个ndk-build.cmd脚本,可以直接利用这个脚本编译。想要做到这一 点,只要为Eclipse Android工程添加一个Builder,就能实现Eclipse的自动编译NDK,这一点在后面的步骤会有介绍

3) NDK实例的实现

启动Eclipse,新建Android工程(此处名为TestNDK),如图所示:



4)加入DNK的路径

菜单栏Windows->preferences->android->DNK

5) 配置 javah 到 eclipse“(可选),主菜单->Run->External Tools->

External Tools Configurations->Program”,如下图所示,只配置了界面中的Main界面:



目的:此步只是将javah工具添加到eclipse中,javah功能生成.h文件,由于函数从java到c/c++需要按一定的格式标准,并且可以函数名复杂,因此经常使用Javah工具生成函数名,若不添加可以通过cmd控制窗口使用此工具。

Javah工具简单的使用方法

其中java中各个命令的意思是

-classpath <路径> 用于装入类的路径
-d <目录> 输出目录
-jni 生成 JNI样式的头文件(默认)
-d 生成的.h文件存放的位置目录,

-classpath <路径> 用于装入类的路径,此处使用的是.class文件,并非.Java文件,同时注意包的概念,例如:

Main.java文件位置如上图所示

Main.java的全部内容如下图所示: package mwic32为包定义,-classpath 为包的目录,而非.class文件的目录,不明白一会演示

-jni 是必须的,我因没加导致javah使用错误,因为我们已经加了包的路径了,但保重可能有很多.class类,我们需要javah哪个类呢,由此-jni定义,-jin 内容:包名+类名(没有.class,是类名字)

例子:使用cmd控制台cd到.java文件目录,使用javah工具如下图,其中.bin文件夹自己创建存放包,bin文件夹为空,javac之后产生包


写了这么多就是将javah配到eclipse里面去时,里面参数如何配置


6) 创建builder,此builder的作用是将之前配置好的javah工具添加到builder中,按Ctrl + B,进行build all功能,在编译时同时javah:

选中工程->右击->Properties->builder->import,不要create。

7)创建Android.mk和.cpp文件以及库:

选中工程->右击->Android tools->add native support,填写库名,自动完成以上功能

8)创建.java文件,此文件即是某部分你要在.cpp中实现其功能的文件;

需要完成的函数声明如下:static public native int add(int x, int y); (static可不要,native是必须要)

9)生成.h文件:主菜单->Run->External Tools->(你刚才创建的localtalkiejavah工具)。

生成.h,在.cpp文件实现其函数即可,

10)本身完成工作后,run as 总是异常中断,经网上之如下原因,解决办法extern "C"{  已完成的函数定义 }。

原因:

JNIEnv *env参数的使用

所有JNI接口的第一个参数是JNIEnv *env, 在C中,使用方法是

(*env)->NewStringUTF(env, "Hello from JNI!");

但在C++中,其调用方法是

env->NewStringUTF("Hello from JNI!");

为什么有这种区别呢,看看jni.h中关于JNIEnv的定义就可以知道了:

#if defined(__cplusplus)

typedef _JNIEnv JNIEnv;

#else

typedef const struct JNINativeInterface* JNIEnv;

#endif

可以看到,对于C和C++,定义有所不同,主要原因是C不支持类,所以采用了一种变通的方法。

以上工作已完结,自己一些猜测:

首先javah可不必加入eclipse,我们只是希望更方便才加入的,

其次,加入javah之后也可不必创建builder,我们只是希望更方便,编译时即可实现javah,

实际编写android.mk才是技术,只是刚创建简单的,自己也没学如何编写,就先写到这。

补充:有的人create一个builder,加入DNK的ndk-build.cmd,参照:http://www.th7.cn/Program/Android/201409/287799.shtml

我是即import了,同时按照此create了,之前遗忘,特补充。

0 0
原创粉丝点击