Windows平台下如何使用Android NDK(mini-cygwin)

来源:互联网 发布:淘宝美工需要做着什么 编辑:程序博客网 时间:2024/06/06 19:01

一.准备工作

下载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本地库导致的

原创粉丝点击