[Android]Cygwin使用及NDK编译方法
在Windows XP, Cygwin, NDK SDK r5b下成功编译了ffmpeg,下面是完整的编译过程:
一、准备工作
2、下载Cygwin, 请猛击这里
3、下载Android SDK,请猛击这里,Android SDK的网页
4、下载Android NDK SDK r5b, 请猛击这里,NDK SDK的网页
5、下载ffmpeg,可以下载压缩包,也可以git一个snapshot
好了,有必要说明一下Android SDK和Android NDK SDK的区别:
- Android SDK用于开发Android程序,开发语言为Java,主要用于界面,只能调用系统提供的功能;
- 如果要追求高效率和实现底层一点的功能,就必须得用NDK了,NDK实际上在桌面系统上提供了交叉编译器,使你能够在桌面系统上编译和调试Anroid程序,开发语言是C和C++,google官方文档里说了,可以只使用C/C++开发应用程序,可以不使用Java,原文如下:Starting from API level 9, it is possible to entirely write an Android
application with native code (i.e. without any Java). That does not mean
that your code does not run inside a VM though, and most of the features
of the platform will still need to be accessed through JNI.For more information about this topic, please read the dedicated
document named docs/NATIVE-ACTIVITY.html (TODO: WRITE DOC).文档:android-ndk-r5b/docs/STABLE-APIS.html还带了个例子,例子见\android-ndk-r5b\samples\native-activity\,有兴趣的同学可以研究一下
二、安装过程
1、安装Cygwin
1)下载了一个setup.exe,运行之后,如下图所示:
2)点下一步,就出现下图界面:
3)默认选择第一项不变,再次点下一步,就显示出下面的界面:
4)选择一个根路径,选择一个硬盘空间比较大的盘,会安装很多东东的,我选择g:盘,接着下一步,大家就看到下面的界面了:
5)好了,继续下一步,各位看官耐心点,马上就到重点了:
6)OK,继续,还真罗嗦啊,下一步,见下图:
7)选择一个下载站点,我选择了台湾的ftp服务器,速度还挺快的,还是下一步,如下:
8)重点到了,注意选择要安装的包,其他的默认就行了,关键的是Devel,要选择下面几个包:
autoconf
automake
binutils
gcc
gcc-core
gcc-g++
gdb
libstdc++
make
如果懒得找,就直接点Devel旁边的那个default,变成Install就会全部都装了,不过要下载很长时间,安装完之后有2G多的空间,如果只选上面的几项,会快很多。
如果懒得找,就直接点Devel旁边的那个default,变成Install就会全部都装了,不过要下载很长时间,安装完之后有2G多的空间,如果只选上面的几项,会快很多。
好了,接着下一步,耐心等待安装完,可以去吃个泡面先。
9)设置系统的Path环境变量到G:\cygwin\bin
2、配置SDK
NDK得依赖SDK,所以必须得先配置SDK
1)将下载到的android-sdk_r10-windows.zip,解压到磁盘的跟目录下,比如:e:\android_sdk;
2)设置系统的Path环境变量到e:\android_sdk\platform-tools,如果不设置的话,运行ndk-build的时候会提示adb不在当前Path下。
3、配置NDK
1)将下载到的android-ndk-r5b-windows.zip文件解压到一个文件夹里,最好路径短点,我的放在E:\android\android-ndk-r5b下;
2)设置系统的Path环境变量到e:\android\android-ndk-r5b,输入命令行的时候简单一点。
三、测试配置环境
1)运行cmd
2)输入bash,如果提示“'bash' 不是内部或外部命令,也不是可运行的程序或批处理文件。”请检查cygwin的path路径是否设置正确,运行后控制台会变成下面的样子:
3)在bash里面输入
$cd /cygdrive/e/android/android-ndk-r5b/samples/hello-jni
注意:Cygwin和Mingw不一样,本地磁盘前面有/cygdrive/前缀
4)在bash里面输入
$ndk-build
如果出现如下画面,并且存在这个文件:e:\android\android-ndk-r5b\samples\hello-jni\obj\local\armeabi\libhello-jni.so,恭喜你完成了第一阶段的工作,真不容易啊
8、 此时会下载加载安装包列表
9、Search是可以输入你要下载的包的名称,能够快速筛选出你要下载的包。那四个单选按钮是选择下边树的样式,默认就行,不用动。View默认是Category,建议改成full显示全部包再查,省的一些包被隐藏掉。左下角那个复选框是是否隐藏过期包,默认打钩,不用管它就行,下边开始下载我们要安装的包吧,为了避免全部下载,这里列出了后面开发NDK用得着的包:autoconf2.1、automake1.10、binutils、gcc-core、gcc- , g++、gcc4-core、gcc4-g++、gdb、pcre、pcre-devel、gawk、make(宁可多选,不能少选)共12个包.
10、 然后开始选择安装这些包吧,点skip,把它变成数字版本格式,要确保Bin项变成叉号,而Src项是源码,这个就没必要选了。
11、 下面测试一下cygwin是不是已经安装好了。
运行cygwin,在弹出的命令行窗口输入:cygcheck -c cygwin命令,会打印出当前cygwin的版本和运行状态,如果status是ok的话,则cygwin运行正常。
然后依次输入gcc –v,g++ --version,make –version,gdb –version进行测试,(注意空格和-)如果都打印出版本信息和一些描述信息,非常高兴的告诉你,你的cygwin安装完成了!
三:配置NDK环境变量
1、 首先找到cygwin的安装目录,找到一个home\<你的用户名>\.bash_profile文件,我的是:E:\cygwin\home\Administrator\.bash_profile,(注意:我安装的时候我的home文件夹下面神马都没有,解决 的办法:首先打开环境变量,把里面的用户变量中的HOME变量删掉,在E:\cygwin\home文件夹下建立名为Administrator的文件夹(是用户名),然后把E:\cygwin\etc\skel\.bash_profile拷贝到该文件夹下)。
2、 打开bash_profile文件,添加NDK=/cygdrive/<你的盘符>/<android ndk 目录> 例 如:NDK=/cygdrive/e/android-ndk-r5
export NDK
NDK这个名字是随便取的,为了方面以后使用方便,选个简短的名字,然后保存
3、打开cygwin,输入cd $NDK,如果输出上面配置的/cygdrive/e/android-ndk-r5信息,则表明环境变量设置成功了。
四:用NDK来编译程序
1、 现在我们用安装好的NDK来编译一个简单的程序吧,我们选择ndk自带的例子hello-jni,我的位于E:\android-ndk-r5\samples\hello-jni(根据你具体的安装位置而定),
2、 运行cygwin,输入命令cd /cygdrive/e/android-ndk-r5/samples/hello-jni,进入到E:\android-ndk-r5\samples\hello-jni目录。
3、 输入$NDK/ndk-build,执行成功后,它会自动生成一个libs目录,把编译生成的.so文件放在里面。($NDK是调用我们之前配置好的环境变量,ndk-build是调用ndk的编译程序)
4、 此时去hello-jni的libs目录下看有没有生成的.so文件,如果有,你的ndk就运行正常啦!
生成之后,这时候可以再用ndk的samples里边的例子生成eclipse工程了.
如下,选择新建android工程然后如下图:
然后就可以试验其他的几个例子了.我也还在研究中, 大家一起加油!!!
五:在eclipse中集成c/c++开发环境
(这个好像在国内悲剧啊,下不动啊,在传两个fan墙的软件)
1、 装Eclipse的C/C++环境插件:CDT,这里选择在线安装。
首先登录http://www.eclipse.org/cdt/downloads.php,找到对应你Eclipse版本的CDT插件的在线安装地址。
2、 然后点Help菜单,找到Install New Software菜单
3、 点击Add按钮,把取的地址填进去,出来插件列表后,选Select All,然后选择下一步即可完成安装
4、 安装完成后,在eclispe中右击新建一个项目,如果出现了c/c++项目,则表明你的CDT插件安装成功啦!
六:配置C/C++的编译器
(建议先用命令行编译,然后再研究google ndk samples 里边的例子, 然后再研究傻瓜式的编译)
1、 打开eclipse,导入ndk自带的hello-jni例子,右键单击项目名称,点击Properties,弹出配置界面,之后再点击Builders,弹出项目的编译工具列表,之后点击New,新添加一个编译器,点击后出现添加界面,选择Program,点击OK
2、 出现了添加界面,首先给编译配置起个名字,如:C_Builder
设置Location为<你cygwin安装路径>\bin\bash.exe程序,例如:E:\cygwin\bin\bash.exe,设置Working Directory为<你cygwin安装路径>\bin目录,例如:E:\cygwin\bin
设置Arguments为
--login -c "cd /cygdrive/e/android-ndk-r5/samples/hello-jni && $NDK/ndk-build"(不能改动的,--login –c 是神马意思我也不懂)
上面的配置中/cygdrive/e/android-ndk-r5/samples/hello-jni是你当前要编译的程序的目录,$NDK是之前配置 的ndk的环境变量,这两个根据你具体的安装目录进行配置,其他的不用变,Arguments这串参数实际是 给bash.exe命令行程序传参数,进入要编译的程序目录,然后运行ndk-build编译程序
3、 接着切换到Refresh选项卡,给Refresh resources upon completion打上钩
4、 然后切换到Build Options选项卡,勾选上最后三项
5、 之后点击Specify Resources按钮,选择资源目录,勾选你的项目目录即可
6、 最后点击Finish,点击OK一路把刚才的配置都保存下来,注意:如果你配置的编译器在其它编译器下边,记得一定要点Up按钮,把它排到第一位,否则C代码的编译晚于Java代码的编译,会造成你的C代码要编译两次才能看到最新的修改
7、 这一路下来肯定很累了吧,现在再次恭喜你,编译配置也配置完成啦,现在来测试一下是否可以自动编译呢,打开项目jni目录里的hello-jni.c文件把提示Hello from JNI!改成其他的文字:如:Hello,My name is alex.,然后再模拟器中运行你的程序,如果模拟器中显示了你最新修改的文字,那么Congratulations!你已经全部配置成功啦!