一.准备工作
下载mini-cygwin,地址:http://code.google.com/p/mini-cygwin/downloads/list
下载ndk(这边使用的android-ndk-r6b),地址:http://dl.google.com/android/ndk/android-ndk-r6b-windows.zip
这边请确保mini-cygwin支持所下载的ndk版本
二.配置mini-cygwin
这边参考http://www.linuxidc.com/Linux/2011-09/43519.htm
1.解压mini-cygwin到c:\(建议),当然你可以解压磁盘的任意地方,但是要修改cygwin.reg
2.修改ndk.bat,将修改成你对应的ndk路径就可以了
3.测试环境,在win7下,进入cygwin的根目录,右键cygwin.bat,"以管理员身份运行",不然的话,会导致后面编译时抛出Permission denied
按下图输入命令,如果结果为图中显示,则表示成功
三.编译
编译native-activity,就不再赘述,可以参考http://www.linuxidc.com/Linux/2011-09/43519.htm
编译jni,参考http://hi.baidu.com/%D7%D4%D3%C9%B5%C6%CB%FE/blog/item/1df2aa242ff46236d507428b.html
1.在JAVA代码中声明native方法,
2.生成头文件
然后需要生成C或C++的源码,供JAVA调用。
可以按照JNI的命名规则,也可以使用JDK的javah命令来生成,这里推荐使用javah,避免手动编写出现错误不好排查。
javah命令的使用方法见javah命令的帮助
这里以我的测试工程为例,编写好native方法后,编译工程,eclipse会在bin目录生成.class文件,在命令行中进入bin目录,执行javah + 包名 + 类名,会在bin目录下生成一个头文件。
这个文件就是JAVA与本地代码交互的接口了,做C或C++的开发人员针对这个头文件开发。
3. 编写本地方法
在你的工程根目录下创建jni文件夹,并从android-ndk\samples里的hello-jni文件夹中拷贝出一个Android.mk文件,粘贴到jni文件夹中,同时刚才用javah生成的.h头文件拷贝到jni文件夹中。
首先创建一个.c文件,实现头文件中的方法,
4.创建so文件
小弟这边是在x:\android-ndk-r6b\samples创建一个和项目同名文件夹,再创建一个jni的文件夹.
路径为x:\android-ndk-r6b\samples\<项目名>\jni里面放Android.mk,.cpp,.h文件
编辑Android.mk文件,修改如下两行,第一行修改为你的工程名,第二行修改为你的.c或.cpp文件名
LOCAL_MODULE := EX25_JNI
LOCAL_SRC_FILES := org_yuchen_demo_MainActivity.c
如果用到STL则需要配置Application.mk文件,内容为:# Build both ARMv5TE and ARMv7-A machine code.
APP_STL := stlport_static
system --> 系统默认的最小支持的C++运行时库
stlport_static --> 以静态链接的方式使用stlport版本的STL
stlport_shared --> 以动态链接的方式使用stlport版本的STL
gnustl_static --> 以静态链接的方式使用gnu版本的STL
详细可以参考http://www.cppblog.com/kongque/archive/2011/06/29/149781.html
然后通过mini-cygwin环境下进行编译生成.so文件.
5.在java代码中加载so文件
在java代码中用静态块加载so文件,注意把so文件的“lib”和“.so”扩展名去掉。
小弟刚接触ndk,在这边询问下各位大神,之前在vs2010下能够成功编译的c++,而在cyg上却不行说
error:error:expected initializer before 'xxx'
是不是c++的文件依赖了win本地库导致的