记录一下Windows下Android NDK的配置方法。
1.下载NDK
http://dl.google.com/android/ndk/android-ndk-r4-windows.zip
此为r4版,因此以下均为r4版的配置方法。
2.下载安装Cygwin
http://www.cygwin.com/setup.exe
此为安装程序,需要在线下载一些安装包,选一个台湾的镜像下载,速度能够快一些。
选择安装包时,一定把gcc和GNU的安装选项Default改为Install,以确保安装,其他的默认即可。
安装选择时选择下载并安装,就省得下载完毕再手动运行setup.exe安装了。默认情况安装在C:/Cygwin下。
3.安装NDK
解压第一步下载的zip文件到合适的目录下。
修改Cygwin的环境变量(玩过Linux此步骤就会很明了)。具体为:
1)用UltraEdit等编辑器打开C:/Cygwin/home/你Windows账户名/.bash_profile文件。
2)在文件底部添加
export ANDROID_NDK_ROOT=/cygdrive/D/Android/android-ndk-r04-windows
其中/cygdrive/是必须有的,后面D/Android/android-ndk-r04-windows表明NDK解压在D:/Android/android-ndk-r04-windows下。注意,目录中尽量不要有空格。
3)为了之后编译的方便,可以再添加
export NDK=/cygdrive/D/Android/android-ndk-r04-windows
4.可以参考NDK目录下samples/hello-jni。这是利用JNI从C语言端返回字符串到Java端输出的一个简单例子。
5.自建工程的话,需要在工程里添加jni文件夹,该文件夹用于存放C/C++代码以及make文件。make文件必须叫Android.mk,如何书写也可参考hello-jni中的该文件。
6.有关C/C++接口函数的命名:
JNIEXPORT void JNICALL Java_包名_类名_函数名(JNIEnv * env, jobject obj);
其中,Java为必须,包名中的”.“用”_“代替,类名是以该函数为成员函数的类的名称,两个参数是从Java端通过JNI转换过来的。
对应Java端该函数原型就是
private / public native void 函数名();
为某类的成员函数,参数空,返回空。
7.有关JNI类型转换
刚才看到,Java端参数空时,C/C++端需要添加JNIEnv *env, jobject obj。那么其他类型变量的对应关系如何呢?
可以参考jni.h。
Java中boolean, byte, char, short, int, long, float, double分别对应C/C++中
jboolean, jbyte, jchar, jshort, jint, jlong, jfloat, jdouble。
一维数组类型对应规律是,Java中*[]对应于C/C++中j*Array,比如int[]对jintArray,byte[]对应于jbyteArray等等。
String与二维数组暂不讨论。
以上对应关系可用于参数和返回值。
8.C/C++端也可以调用上层Java的类方法,具体操作不在这里讨论了。
9.C/C++程序的编译
打开Cygwin,先检查一下gcc与GNU的配置:输入gcc --v和make --v,如果打印出版本号,则表示安装成功。
然后cd到要编译的工程目录。
再输入$NDK/ndk-build即可。
其中NDK为第6步添加的环境变量。
10.在Eclipse里先Project->Clean,再运行。注意,每次更改C/C++文件,然后Cygwin编译,在Eclipse里都要先Clean一下,否则新生成的so链接库可能不会被链接到apk文件中,而是保持之前的结果。