一、先准备好需要安装的文件 :
1.cygwin
2. Android NDK r5 Windows
3.用Eclipse的Install New Software ADD网址 (http://download.eclipse.org/releases/helios),往下翻啊翻,找到(C/C++ Development Tools 打勾,上下的也都可以打,像 C/C++ Memory View Enhancements 也可以蛮装下)安装CDT (这点可以先完成,是给eclipse安装编译环境.cdt)
cygwin
① 首先到http://www.cygwin.com下载setup.exe ,接着建立安装目录,如X:/cygwin (我用的是 E:/cygwin ) ,将setup.exe放到此目录。
② 启动安装:安装过程可以参考 http://www.61ic.com/Mobile/Android/201105/34543.html
当然可以不完全使用它的方法 在安装的过程中
选择 Download without installing 选项 可以把cygwin 下载到本地 方便下次安装
为了快速安装 先提供国内快速下载地址:
镜像地址: http://mirrors.163.com/cygwin
安装好cygwin 测试方法也可参照上面文章
安装NDK 时直接解压 就可以了 ,注意解压路径不要有空格
下面就是设置环境变量了 把安装的cygwin 目录下的 D:/cygwin/etc/skel/.bash_profile 复制到 cygwin的D:/cygwin/home/Administrator 目录下 并在 .bash_profile 中添加
NDK=/cygdrive/F/Android_NDK/android-ndk-r5
export NDK
然后保存 就OK 了
测试是否成功
就可以了
下面就是关联 eclipse
接下来是windows下面的配置:
在晕的死下可以配置eclipse,ndk,cygwin,使得可以在eclipse中直接对android项目中编写c/c++代码并且自动编译,就像写java代码一样方便(当然,其实没有写java代码方便啦,写java代码可是有代码提醒功能的),当然,这个配置并不如在linux下配置简单。 前提条件:首先要确保cygwin安装好了且可以运行,建议将devel下面的所有包都装上,谁知道那个什么时候要用上呢。
1.在cygwin中设置环境变量
打开C:/cygwin/home/tao/.bash_profile 文件(假设cygwin是安装在C:/cygwin目录),在最后添加以下内容: ANDROID_NDK_ROOT=/cygdrive/d/android-ndk-r5b export ANDROID_NDK_ROOT
保存后退出;
2.配置eclipse自动编译c文件为.so库右键点击项目,properties,builder,new,program,在main标签location为cygwin安装目录的bin目录下的bash.exe文件路径,working directory则为cygwin安装目录下的bin目录路径重点是arguments:
--login -c "cd /cygdrive/d/workspace/hello-jni&&$ANDROID_NDK_ROOT/ndk-build"
这条命令的意思是:在cygwin环境下进入你的android项目的目录里面,执行ndk的ndk-build命令编译c代码。相当于在linux环境中打开命令行终端,进入你的android项目再用ndk的ndk-build编译c代码。其实,cygwin就是对linux环境的一个模拟,这也是为什么在晕的死的环境下搭建这个环境这么麻烦的原因了。 Cd /cygdrive/d/workspace/hello-jni命令的作用就是进入windows文件结构下的d盘下的workspace/hello-jni目录,也就是你eclipse中android项目的绝对路径,而$ANDROID_NDK_ROOT就是在第一步中配置的环境变量,指向ndk跟目录,这条命令的意思就是执行ndk-build程序编译c代码了,编译完了以后会在android项目的libs目录下生成一个.so文件。完整的配置图下图:
其他配置与linux环境下一致。
接下来是非常有用的部分,不是必需的,但是加上他以后会有一种一切都是那么的的心应手的感觉-----在eclipse中用ant生成jni头文件。
最近在学习android的ndk,用到jni是必须的了,虽然跟java打交道也有些年头了,但是jni是从来没有用过,一研究才发现,这玩意用起来真不是一般的麻烦。先不说实际代码编写过程中完全不会有像java那样有代码提示功能可以用,光是从java生成c头文件这一步骤就有够头疼的,我们要先写一个java类文件,然后将这个类文件编译成class文件,再用class文件生成c头文件。粗一看这不也挺简单的吗,不就是javac,javah两个命令一跑就完了么?这话也没错啦,如果只是学习,一个helloworld,顶多也就一两个类文件而已,用命令行一跑的确很简单。可是我们往深了一想,一般的软件,代码动不动就以万行计,文件数量也是几十上百甚至上千个,假如一个项目5个人做,涉及到ndk的类有十几二十个,方法也是时不时就加几个,这个时候还频繁的打开命令行cd到工程目录再javac,javah?饶了我吧,像我这么懒的人要我用这么笨拙的方法做这么繁琐的事情除非真的是没有别的办法了。上网搜索了一把,有人写bat或者shell来做这个事情,当然这不失为一个不错的方法,但是我还是觉得不是很满意。思来想去的就想到ant,既然我们用的是eclipse,而eclipse本身就集成了ant,放着这样的利器不用去一个个敲命令,写bat,shell?这不是傻吗。遂赶紧整了一个build文件,一跑,嘿,别说,还真给力。内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!-- - - - - - - - - - - - - - - - - - 定义的一些常量,类似于java中的常量 - - - - - - - - - - - - - - - - - -->
<project basedir="." default="main" name="build c h file">
<property name="src" value="src" />
<property name="classes" value="classes" />
<property name="jni" value="jni" />
<property name="androidpath" value="E:/android-sdk-windows/platforms/android-8/android.jar" />
<!-- - - - - - - - - - - - - - - - - - 编译时需要用到的一些classpath - - - - - - - - - - - - - - - - - -->
<path id="classpath"> <pathelement path="${androidpath}"/> </path>
<path id="sourcepath"> <pathelement location="${src}"/> </path>
<path id="classes"> <pathelement location="${classes}"/> </path>
<!-- - - - - - - - - - - - - - - - - - target: 做一些初始化工作 - - - - - - - - - - - - - - - - - -->
<target name="init">
<delete dir="${jni}" includes="**/*.h"></delete>
<mkdir dir="${classes}"/>
</target>
<!-- - - - - - - - - - - - - - - - - - target: 将java文件编译成class文件 - - - - - - - - - - - - - - - - - -->
<target name="javatoclass" depends="init">
<javac srcdir="${src}" destdir="${classes}">
<classpath refid="classpath"></classpath>
<sourcepath refid="sourcepath"></sourcepath>
<include name="com/example/hellojni/*.*"/>
<exclude name="com/example/*"/>
</javac>
</target>
<!-- ================================= target: 将class文件编译成c语言头文件 ================================= -->
<target name="classtoch" depends="javatoclass" description="description">
<javah destdir="${jni}">
<classpath refid="classes"></classpath>
<classpath refid="classpath"></classpath>
<class name="com.example.hellojni.HelloJni"/>
</javah>
</target>
<!-- ================================= target: 删除class文件夹下的所有class ================================= -->
<target name="deleteclass" depends="classtoch" description="description">
<delete dir="${classes}"></delete>
</target>
<target name="main" depends="init,javatoclass,classtoch,deleteclass"></target>
</project>
这里有两点需要说明:
一是最开始我运行这个build文件时抛出了找不到javac的错误,以为因为没有给java配系统环境变量的原因,之后配上以后发现依然是这个错,思索良久终于醒悟过来,eclipse用的是自己指定的jdk来编译文件的,遂配置了一个,再运行,终于大功告成。
二是javah这个命令并不像javac那样可以用通配符来表示批量的文件,只能一个个的来,所以,只能取一个折衷的办法,这里采取的办法就是用class元素,一个一个的列出需要编译的class文件,例如<class name="com.example.hellojni.HelloJni2"/>,把这个放到javah元素里面就可以了。
具体参照:http://blog.youkuaiyun.com/yixiaoqingyuz/archive/2011/05/01/6382033.aspx