本文有些转载,分结合自己试验所得。
本文操作系统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),如图所示:
菜单栏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中各个命令的意思是
-d <目录> 输出目录
-jni 生成 JNI样式的头文件(默认)
-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是必须要)
生成.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了,之前遗忘,特补充。