eclipse中集成android ndk开发环境的配置

<!--@page { margin: 2cm }P { margin-bottom: 0.21cm }-->

这篇文档默认是在linux环境下面的配置方法,因为公司都是用的windows所以我也配置了一个windows的开发环境。先讲linux的配置,然后再讲windows的。

 

 

前提条件:eclipsesdkadtcdtndk都已经装好。

第一步:在需要用到ndk的项目上面右键属性选择builder,如图:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

猛击new新建一个编译器,如图,选择program

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

下面这张图是自定义编译器的配置页面,可以看到,有四个标签,先配第一个main标签,在main标签下,location中配置的是ndk目录下面ndk-build程序的地址(记住,这是在linux环境下才可以这么配,windows中的配置方法实际上是对linux下配置方法的一种模拟),workingdirectory则是配置为需要用到这个编译器的工程,猛击browseworkingspace选中对应的项目就成了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

refresh标签主要是配置编译完了以后需要刷新的目录,这里选择libs目录,若没有这新建一个。下面两图所示。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Buildoptions标签主要是配置看需要监视那个目录,只要这个目录下面的文件发生变化就立即执行编译动作,这里选择项目中c或者c++代码所在目录,注意要勾选上runthe builder下面的几项。具体配置图下面两图所示:

 

 

 

 

到此,该配置的都已经配置完成,记得猛击applyok按钮保存配置。

 

接下来是windows下面的配置:

 

在晕的死下可以配置eclipsendkcygwin,使得可以在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

这里有点要特别注意,在windows下换行符和linux不同,因此不能直接在编辑文件的时候用回车换行,否则会出错,应该复制文件中本来的换行符使用,即复制张贴。

保存后退出;

 

2.配置eclipse自动编译c文件为.so库右键点击项目,propertiesbuildernewprogram,在main标签locationcygwin安装目录的bin目录下的bash.exe文件路径,workingdirectory则为cygwin安装目录下的bin目录路径重点是arguments

 

--login-c "cd/cygdrive/d/workspace/hello-jni&&$ANDROID_NDK_ROOT/ndk-build"

 

这条命令的意思是:在cygwin环境下进入你的android项目的目录里面,执行ndkndk-build命令编译c代码。相当于在linux环境中打开命令行终端,进入你的android项目再用ndkndk-build编译c代码。其实,cygwin就是对linux环境的一个模拟,这也是为什么在晕的死的环境下搭建这个环境这么麻烦的原因了。Cd/cygdrive/d/workspace/hello-jni命令的作用就是进入windows文件结构下的d盘下的workspace/hello-jni目录,也就是你eclipseandroid项目的绝对路径,而$ANDROID_NDK_ROOT就是在第一步中配置的环境变量,指向ndk跟目录,这条命令的意思就是执行ndk-build程序编译c代码了,编译完了以后会在android项目的libs目录下生成一个.so文件。完整的配置图下图:

 

 

其他配置与linux环境下一致。

 

接下来是非常有用的部分,不是必需的,但是加上他以后会有一种一切都是那么的的心应手的感觉-----eclipse中用ant生成jni头文件。

 

最近在学习androidndk,用到jni是必须的了,虽然跟java打交道也有些年头了,但是jni是从来没有用过,一研究才发现,这玩意用起来真不是一般的麻烦。先不说实际代码编写过程中完全不会有像java那样有代码提示功能可以用,光是从java生成c头文件这一步骤就有够头疼的,我们要先写一个java类文件,然后将这个类文件编译成class文件,再用class文件生成c头文件。粗一看这不也挺简单的吗,不就是javacjavah两个命令一跑就完了么?这话也没错啦,如果只是学习,一个helloworld,顶多也就一两个类文件而已,用命令行一跑的确很简单。可是我们往深了一想,一般的软件,代码动不动就以万行计,文件数量也是几十上百甚至上千个,假如一个项目5个人做,涉及到ndk的类有十几二十个,方法也是时不时就加几个,这个时候还频繁的打开命令行cd到工程目录再javacjavah?饶了我吧,像我这么懒的人要我用这么笨拙的方法做这么繁琐的事情除非真的是没有别的办法了。上网搜索了一把,有人写bat或者shell来做这个事情,当然这不失为一个不错的方法,但是我还是觉得不是很满意。思来想去的就想到ant,既然我们用的是eclipse,而eclipse本身就集成了ant,放着这样的利器不用去一个个敲命令,写batshell?这不是傻吗。遂赶紧整了一个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元素里面就可以了。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值