android源码ndk
‘壹’ Android各个版本的NDK官方下载链接
NDK官方网站:https://developer.android.google.cn/ndk/downloads/index.html?hl=zh-cn
Google Android NDK官网
ndk_r14b (March 2017)
Windows 32 位: android-ndk-r14b-windows-x86.zip
SHA1校验:
Windows 64 位: android-ndk-r14b-windows-x86_64.zip
SHA1校验:
Mac OS X: android-ndk-r14b-darwin-x86_64.zip
SHA1校验:
linux 64 位 (x86): android-ndk-r14b-linux-x86_64.zip
SHA1校验:
ndk_r13b (Oct 2016)
Windows 32-bit : android-ndk-r13b-windows-x86.zip
Windows 64-bit: android-ndk-r13b-windows-x86_64.zip
Mac OS X : android-ndk-r13b-darwin-x86_64.zip
Linux: android-ndk-r13b-linux-x86_64.zip
ndk_r13 (Sept 2016)
Windows 32-bit : https://dl.google.com/android/repository/android-ndk-r13-windows-x86.zip
Windows 64-bit : https://dl.google.com/android/repository/android-ndk-r13-windows-x86_64.zip
Mac OS X : https://dl.google.com/android/repository/android-ndk-r13-darwin-x86_64.zip
Linux : https://dl.google.com/android/repository/android-ndk-r13-linux-x86_64.zip
ndk_r12 (June 2016)
Windows 32-bit : http://dl.google.com/android/repository/android-ndk-r12b-windows-x86.zip
Windows 64-bit : http://dl.google.com/android/repository/android-ndk-r12b-windows-x86_64.zip
Mac OS X 64-bit : http://dl.google.com/android/repository/android-ndk-r12b-darwin-x86_64.zip
Linux 64-bit (x86) : http://dl.google.com/android/repository/android-ndk-r12b-linux-x86_64.zip
ndk_r11c (March 2016)
Windows 32-bit : http://dl.google.com/android/repository/android-ndk-r11c-windows-x86.zip
Windows 64-bit : http://dl.google.com/android/repository/android-ndk-r11c-windows-x86_64.zip
Mac OS X 64-bit : http://dl.google.com/android/repository/android-ndk-r11c-darwin-x86_64.zip
Linux 64-bit (x86) : http://dl.google.com/android/repository/android-ndk-r11c-linux-x86_64.zip
ndk_r11b (March 2016)
Windows 32-bit : http://dl.google.com/android/repository/android-ndk-r11b-windows-x86.zip
Windows 64-bit : http://dl.google.com/android/repository/android-ndk-r11b-windows-x86_64.zip
Mac OS X 64-bit : http://dl.google.com/android/repository/android-ndk-r11b-darwin-x86_64.zip
Linux 64-bit (x86) : http://dl.google.com/android/repository/android-ndk-r11b-linux-x86_64.zip
ndk_r11 (March 2016)
Windows 32-bit : http://dl.google.com/android/repository/android-ndk-r11-windows-x86.zip
Windows 64-bit : http://dl.google.com/android/repository/android-ndk-r11-windows-x86_64.zip
Mac OS X 64-bit : http://dl.google.com/android/repository/android-ndk-r11-darwin-x86_64.zip
Linux 64-bit (x86) : http://dl.google.com/android/repository/android-ndk-r11-linux-x86_64.zip
ndk_r10e(Jan 2015)
Windows32-bit : http://dl.google.com/android/ndk/android-ndk-r10e-windows-x86.exe
Windows64-bit : http://dl.google.com/android/ndk/android-ndk-r10e-windows-x86_64.exe
MacOS X 64-bit : http://dl.google.com/android/ndk/android-ndk-r10e-darwin-x86_64.bin
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk-r10e-darwin-x86.bin
Linux32-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r10e-linux-x86.bin
Linux64-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin
ndk_r10d(December 2014)
Windows32-bit : http://dl.google.com/android/ndk/android-ndk-r10d-windows-x86.exe
Windows64-bit : http://dl.google.com/android/ndk/android-ndk-r10d-windows-x86_64.exe
MacOS X 64-bit : http://dl.google.com/android/ndk/android-ndk-r10d-darwin-x86_64.bin
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk-r10d-darwin-x86.bin
Linux32-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r10d-linux-x86.bin
Linux64-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r10d-linux-x86_64.bin
ndk_r10c(October2014)
Windows32-bit : http://dl.google.com/android/ndk/android-ndk-r10c-windows-x86.exe
Windows64-bit : http://dl.google.com/android/ndk/android-ndk-r10c-windows-x86_64.exe
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk-r10c-darwin-x86.bin
MacOS X 64-bit : http://dl.google.com/android/ndk/android-ndk-r10c-darwin-x86_64.bin
Linux32-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r10c-linux-x86.bin
Linux64-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r10c-linux-x86_64.bin
ndk_r10b(September2014)
Windows32-bit : http://dl.google.com/android/ndk/android-ndk32-r10b-windows-x86.zip
Windows64-bit : http://dl.google.com/android/ndk/android-ndk32-r10b-windows-x86_64.zip
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk32-r10b-darwin-x86.tar.bz2
MacOS X 64-bit : http://dl.google.com/android/ndk/android-ndk32-r10b-darwin-x86_64.tar.bz2
Linux32-bit (x86) : http://dl.google.com/android/ndk/android-ndk32-r10b-linux-x86.tar.bz2
Linux64-bit (x86) : http://dl.google.com/android/ndk/android-ndk32-r10b-linux-x86_64.tar.bz2
ndk_r10(July2014)
Windows32-bit : http://dl.google.com/android/ndk/android-ndk32-r10-windows-x86.zip
Windows64-bit : http://dl.google.com/android/ndk/android-ndk32-r10-windows-x86_64.zip
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk32-r10-darwin-x86.tar.bz2
MacOS X 64-bit : http://dl.google.com/android/ndk/android-ndk32-r10-darwin-x86_64.tar.bz2
Linux32-bit (x86) : http://dl.google.com/android/ndk/android-ndk32-r10-linux-x86.tar.bz2
Linux64-bit (x86) : http://dl.google.com/android/ndk/android-ndk32-r10-linux-x86_64.tar.bz2
ndk_r9d(March2014)
Windows32-bit : http://dl.google.com/android/ndk/android-ndk-r9d-windows-x86.zip
Windows64-bit : http://dl.google.com/android/ndk/android-ndk-r9d-windows-x86_64.zip
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk-r9d-darwin-x86.tar.bz2
MacOS X 64-bit : http://dl.google.com/android/ndk/android-ndk-r9d-darwin-x86_64.tar.bz2
Linux32-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r9d-linux-x86.tar.bz2
Linux64-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r9d-linux-x86_64.tar.bz2
ndk_r9c(December2013)
Windows32-bit : http://dl.google.com/android/ndk/android-ndk-r9c-windows-x86.zip
Windows64-bit : http://dl.google.com/android/ndk/android-ndk-r9c-windows-x86_64.zip
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk-r9c-darwin-x86.tar.bz2
MacOS X 64-bit : http://dl.google.com/android/ndk/android-ndk-r9c-darwin-x86_64.tar.bz2
Linux32-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r9c-linux-x86.tar.bz2
Linux64-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r9c-linux-x86_64.tar.bz2
ndk_r9b(October 2013)
Windows32-bit : http://dl.google.com/android/ndk/android-ndk-r9b-windows-x86.zip
Windows64-bit : http://dl.google.com/android/ndk/android-ndk-r9b-windows-x86_64.zip
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk-r9b-darwin-x86.tar.bz2
MacOS X 64-bit : http://dl.google.com/android/ndk/android-ndk-r9b-darwin-x86_64.tar.bz2
Linux32-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r9b-linux-x86.tar.bz2
Linux64-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r9b-linux-x86_64.tar.bz2
ndk_r9(July 2013)
Windows32-bit : http://dl.google.com/android/ndk/android-ndk-r9-windows-x86.zip
Windows64-bit : http://dl.google.com/android/ndk/android-ndk-r9-windows-x86_64.zip
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk-r9-darwin-x86.tar.bz2
MacOS X 64-bit : http://dl.google.com/android/ndk/android-ndk-r9-darwin-x86_64.tar.bz2
Linux32-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r9-linux-x86.tar.bz2
Linux64-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r9-linux-x86_64.tar.bz2
ndk_r8e(March 2013)
Windows32-bit : http://dl.google.com/android/ndk/android-ndk-r8e-windows-x86.zip
Windows64-bit : http://dl.google.com/android/ndk/android-ndk-r8e-windows-x86_64.zip
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk-r8e-darwin-x86.tar.bz2
MacOS X 64-bit : http://dl.google.com/android/ndk/android-ndk-r8e-darwin-x86_64.tar.bz2
Linux32-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r8e-linux-x86.tar.bz2
Linux64-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r8e-linux-x86_64.tar.bz2
Note :
NDKr8e is the first NDK with 32bit and 64bit releases. The prior ones were all32bit and didn’t have any suffix, so r8b would be:
ndk_r8d(December 2012)
Windows32-bit : https://dl.google.com/android/ndk/android-ndk-r8d-windows.zip
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk-r8d-darwin-x86.tar.bz2
Linux32-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r8d-linux-x86.tar.bz2
ndk_r8C(November 2012)
Windows32-bit : https://dl.google.com/android/ndk/android-ndk-r8C-windows.zip
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk-r8C-darwin-x86.tar.bz2
Linux32-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r8C-linux-x86.tar.bz2
ndk_r8b(July 2012)
Windows32-bit : https://dl.google.com/android/ndk/android-ndk-r8b-windows.zip
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk-r8b-darwin-x86.tar.bz2
Linux32-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r8b-linux-x86.tar.bz2
ndk_r8(May 2012)
Windows32-bit : https://dl.google.com/android/ndk/android-ndk-r8-windows.zip
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk-r8-darwin-x86.tar.bz2
Linux32-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r8-linux-x86.tar.bz2
ndk_r7c(April 2012)
Windows32-bit : https://dl.google.com/android/ndk/android-ndk-r7c-windows.zip
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk-r7c-darwin-x86.tar.bz2
Linux32-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r7c-linux-x86.tar.bz2
ndk_r7b(February 2012)
Windows32-bit : https://dl.google.com/android/ndk/android-ndk-r7b-windows.zip
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk-r7b-darwin-x86.tar.bz2
Linux32-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r7b-linux-x86.tar.bz2
ndk_r7(November 2011)
Windows32-bit : https://dl.google.com/android/ndk/android-ndk-r7-windows.zip
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk-r7-darwin-x86.tar.bz2
Linux32-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r7-linux-x86.tar.bz2
ndk_r6b(August 2011)
Windows32-bit : https://dl.google.com/android/ndk/android-ndk-r6b-windows.zip
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk-r6b-darwin-x86.tar.bz2
Linux32-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r6b-linux-x86.tar.bz2
ndk_r6(July 2011)
Windows32-bit : https://dl.google.com/android/ndk/android-ndk-r6-windows.zip
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk-r6-darwin-x86.tar.bz2
Linux32-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r6-linux-x86.tar.bz2
ndk_r5c(June 2011)
Windows32-bit : https://dl.google.com/android/ndk/android-ndk-r5c-windows.zip
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk-r5c-darwin-x86.tar.bz2
Linux32-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r5c-linux-x86.tar.bz2
ndk_r5b(January 2011)
Windows32-bit : https://dl.google.com/android/ndk/android-ndk-r5b-windows.zip
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk-r5b-darwin-x86.tar.bz2
Linux32-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r5b-linux-x86.tar.bz2
ndk_r5(December 2010)
Windows32-bit : https://dl.google.com/android/ndk/android-ndk-r5-windows.zip
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk-r5-darwin-x86.tar.bz2
Linux32-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r5-linux-x86.tar.bz2
ndk_r4b(June 2010)
Windows32-bit : https://dl.google.com/android/ndk/android-ndk-r4b-windows.zip
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk-r4b-darwin-x86.zip
Linux32-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r4b-linux-x86.zip
ndk_r4(may 2010)
Windows32-bit : https://dl.google.com/android/ndk/android-ndk-r4-windows.zip
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk-r4-darwin-x86.zip
Linux32-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r4-linux-x86.zip
ndk_r3(March 2010)
Windows32-bit : https://dl.google.com/android/ndk/android-ndk-r3-windows.zip
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk-r3-darwin-x86.zip
Linux32-bit (x86) : http://dl.google.com/android/ndk/android-ndk-r3-linux-x86.zip
‘贰’ vlc android源码导入android studio还需要ndk编译吗
ndk编译是针对jni的。jni是java native interface的缩写,意为java本地接口。
java本地接口一般是用c语言来实现一些功能,然后通过特定的格式暴露接口给java调用。但是C语言的代码不能直接被java使用,而是需要通过ndk进行编译,编译后会在libs目录下生成.so文件,这事动态运行库,这时C语言曝露出的接口才能被java调用。
楼主可以检查你的vlc项目中的libs目录下,是否包含了.so文件,如果有的话一般是不需要ndk进行 编译的。不过如果楼主修改了c语言中的代码,那么为了使修改生效必须从新用ndk编译,编译后会删除原来生成的.so,并生成新的.so文件。
使用ndk-r7以及更高版本的ndk,可以免安装cygwin而直接使用命令行进行编译,非常方便。
方法:
将ndk的根目录设置环境变量,然后dos命令行进入需要编译的项目的根目录,执行命令
ndk-build
‘叁’ ANDROID NDK开发求助
一、NDK产生的背景
Android平台从诞生起,就已经支持C、C++开发。众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语言。但这并不等同于“第三方应用只能使用Java”。在Android SDK首次发布时,Google就宣称其虚拟机Dalvik支持JNI编程方式,也就是第三方应用完全可以通过JNI调用自己的C动态库,即在Android平台上,“Java+C”的编程方式是一直都可以实现的。
不过,Google也表示,使用原生SDK编程相比Dalvik虚拟机也有一些劣势,Android SDK文档里,找不到任何JNI方面的帮助。即使第三方应用开发者使用JNI完成了自己的C动态链接库(so)开发,但是so如何和应用程序一起打包成apk并发布?这里面也存在技术障碍。比如程序更加复杂,兼容性难以保障,无法访问Framework
API,Debug难度更大等。开发者需要自行斟酌使用。
于是NDK就应运而生了。NDK全称是Native Development Kit。
NDK的发布,使“Java+C”的开发方式终于转正,成为官方支持的开发方式。NDK将是Android平台支持C开发的开端。二、为什么使用NDK
1.代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
2.可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。
3.提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。
4.便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。三、NDK简介
1.NDK是一系列工具的集合
NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。
NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。
NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。
2.NDK提供了一份稳定、功能有限的API头文件声明
Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。四、NDK开发环境的搭建
1.下载安装Android NDK
地址:http://developer.android.com/sdk/ndk/index.html
2.下载安装cygwin
由于NDK编译代码时必须要用到make和gcc,所以你必须先搭建一个linux环境, cygwin是一个在windows平台上运行的unix模拟环境,它对于学习unix/linux操作环境,或者从unix到windows的应用程序移植,非常有用。通过它,你就可以在不安装linux的情况下使用NDK来编译C、C++代码了。下载地址:http://www.cygwin.com
1)然后双击运行吧,运行后你将看到安装向导界面。
2)点击下一步,此时让你选择安装方式:
Install from
Internet:直接从Internet上下载并立即安装(安装完成后,下载好的安装文件并不会被删除,而是仍然被保留,以便下次再安装)。
Download Without Installing:只是将安装文件下载到本地,但暂时不安装。
Install from Local Directory:不下载安装文件,直接从本地某个含有安装文件的目录进行安装。
3)选择第一项,然后点击下一步。
4)选择要安装的目录,注意,最好不要放到有中文和空格的目录里,似乎会造成安装出问题,其它选项不用变,之后点下一步:
5)上一步是选择安装cygwin的目录,这个是选择你下载的安装包所在的目录,默认是你运行setup.exe的目录,直接点下一步就可以:
6)此时你共有三种连接方式选择:
Direct Connection:直接连接。
Use IE5 Settings:使用IE的连接参数设置进行连接。
Use HTTP/FTP Proxy:使用HTTP或FTP代理服务器进行连接(需要输入服务器地址、端口号)。
用户可根据自己的网络连接的实情情况进行选择,一般正常情况下,均选择第一种,也就是直接连接方式。然后再点击“下一步”。
7)这是选择要下载的站点,选择后点下一步。
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 –version,g++ --version,make –version,gdb
–version进行测试,如果都打印出版本信息和一些描述信息,则cygwin安装成功!
3.配置 NDK 环境变量
a.首先找到 cygwin 的安装目录,找到一个 home\< 你的用户名 >\.bash_profile 文件,我的是:E:\cygwin\home\Administrator\.bash_profile , ( 注意:我安装的时候我的 home 文件夹下面什么都没有,解决
的办法:首先打开环境变量,把里面的用户变量中的 HOME 变量删掉,在 E:\cygwin\home 文件夹下建立名为Administrator 的文件夹(是用户名),然后把 E:\cygwin\etc\skel\.bash_profile 拷贝到该文件夹下 ) 。
b.打开 bash_profile 文件,添加 NDK=/cygdrive/< 你的盘符 >/<android
ndk 目录 > 例如:
NDK=/cygdrive/e/android-ndk-r5
export NDK
NDK 这个名字是随便取的,为了方面以后使用方便,选个简短的名字,然后保存
c.打开 cygwin ,输入 cd
$NDK ,如果输出上面配置的 /cygdrive/e/android-ndk-r5 信息,则表明环境变量设置成功了。4.用 NDK 来编译程序
a.现在我们用安装好的 NDK 来编译一个简单的程序吧,我们选择 ndk 自带的例子 hello-jni ,我的位于E:\android-ndk-r5\samples\hello-jni( 根据你具体的安装位置而定 ) ,
b.运行 cygwin ,输入命令 cd
/cygdrive/e/android-ndk-r5/samples/hello-jni ,进入到 E:\android-ndk-r5\samples\hello-jni 目录。
c.输入 $NDK/ndk-build ,执行成功后,它会自动生成一个 libs 目录,把编译生成的 .so 文件放在里面。 ($NDK是调用我们之前配置好的环境变量, ndk-build 是调用 ndk 的编译程序 )
d.此时去 hello-jni 的 libs 目录下看有没有生成的 .so 文件,如果有,你的 ndk 就运行正常啦!5.在 eclipse 中集成 c/c++ 开发环境
a.装 Eclipse 的 C/C++ 环境插件: CDT ,这里选择在线安装。首先登录 http://www.eclipse.org/cdt/downloads.php ,找到对应你 Eclipse 版本的 CDT 插件 的在线安装地址。
b.然后点 Help 菜单,找到 Install New Software 菜单
c.点击 Add 按钮,把取的地址填进去,出来插件列表后,选 Select All ,然后选择下一步即可完成安装。
d.安装完成后,在 eclispe 中右击新建一个项目,如果出现了 c/c++ 项目,则表明你的 CDT 插件安装成功啦!
‘肆’ 如何从零开始创建Android NDK应用
本文主内容:
1、 Android NDK 安装
2、 安装Cygwin与使用NDK编译
3、 在Eclipse中集成C/C++开发环境CDT
4、 安装Sequoyah插件
5、 JNI编译环境配置
本文建立在已经完成Android开发环境搭建的基础上。其基础环境至少需要包含以下内容:
1、 JDK
2、 Eclipse
3、 Android SDK and ADT
可以参考我之前的“Android开发环境搭建”。
一、Android NDK 安装与配置
下载Android NDK。下载地址:http://developer.android.com/tools/sdk/ndk/index.html
下载后解压缩到你的工作目录,例如:D:\Java\android-ndk-r8,结果如下图:
注意:samples下面包含几个实例开发演示项目,第一次接触NDK开发,建议先从示例开始。
docs内是技术文档,英语能力强的可以研究研究。
二、安装Cygwin与使用NDK编译
由于NDK开发大都涉及到C/C++在GCC环境下编译、运行,所以在Windows环境下,需要用Cygwin模拟Linux编译环境。
下载:
Cygwin的下载地址:http://www.cygwin.com/
点击右上角的“setup.exe”即可下载。
安装:
第一步:运行setup.exe程序,直接点击Next进入下一步。
第二步:选择安装方式。第一次可以采用Direct Connection在线下载安装,如有现成的离线包,可以选择离线安装(Install from Local Directory)。
第三步:选择安装目录。比如D:\Java\Cygwin,注意此目录是指Cygwin最终的安装目录,不是下载文件蚂皮数暂存目录。
第四步:设置本地包暂存路径。暂存目录默认是放到setup.exe的同级目录下,建议放到指定的文件夹,如D:\Cygwin_install_file。安装完成后把这个文件夹打包备份,以后再配置时不用重新下载。
第五步:设置网络连接方式。这个目前河蟹没爬过来,选第一个即可。
第六步:选闷首择下载站点地址。据说国内163站点的速度不错,我也是用的这个。
第七步:等待加载安装项载入,选择安装项。点击Devel-Default,使之变成Devel-Install,展开后可以看到其下的子项被选中了(网上多数教程都说选中某12个包,找起来太坑爹了,直接全下载了吧,全选多了150M左右)。此界面其他设置都不用动。
第八步:等待下载完成。下载完成时间决定于你选择的安装包数量及网络连接速度,安装我安装的版本,约983M,下载完成后会自动握乱安装到上文设置的安装目录,安装也要时间的,总时间较长,去吃个饭没啥问题。
提醒:第四步的备份建议,尽量去做。如果有备份,第二步中选择离线安装。
验证:
运行安装目录下的“Cygwin.bat”,第一次运行时,它会自动创建用户信息,用户信息存放在“.\Cygwin\home”中。
在运行“Cygwin.bat”打开的命令行窗口输入:“cygcheck -c cygwin”命令,会打印出当前Cygwin的版本和运行状态,如果status是ok的话,则cygwin运行正常。
分别输入:“make –v”和,“gcc –v”命令如果检测成功,会有make和gcc相关版本信息打印出来。
设置NDK路径:
在windows的系统环境变量中添加NDK的路径。使用“/cygdrive/d/Java/android-ndk-r8”这种Linux风格路径,如果使用Windows下的“D:\Java\android-ndk-r8”,Cygwin在编译时会发出警告。
运行Cygwin命令行,可以直接使用此环境变量,当然也可以手动的cd到该目录:
使用NDK编译程序:
现在我们用安装好的NDK来编译一个NDK提供的sample程序hello-jni(我的目录位于:D:\Java\android-ndk-r8\samples\hello-jni)。
第一步:运行Cygwin,配置环境变量后可输入“cd $ndk/samples/hello-jni/”,未配置则输入命令“cd /cygdrive/d/java/android-ndk-r8/samples/hello-jni”,进入到“hello-jni”工程目录。
第二步:编译。输入命令“$ndk/ndk-build”命令即可编译。ndk-build是调用ndk的编译程序。
关于下面的错误,我没遇到,但是前人有总结,记录如下:
错误:Android NDK: Host 'awk' tool is outdated。
解决方法:打开目录“D:\Java\android-ndk-r8\prebuilt\windows\bin\”,删除awk.exe(为保险起见请先备份)。
第三步:到”…/hello-jni/libs/armeabi“目录下看有没有生成的.so文件,如果有,你的ndk就运行正常啦!
导入NDK的hello-jni示例到Eclipse中:
第一步:在Eclipse中新建一个Android工程HelloJni。在Create Android Project时勾选“Create project from existing source”,Location中填“D:\Java\android-ndk-r8\samples\hello-jni” (注意:在选择API level时需要选择1.5或更高的版本)。
第二步:直接以Android Aplication运行。这里要注意,你之前在使用NDK编译程序时要把这个hello-jni编译过并产生了.so文件,此处才能运行起来。
三、在Eclipse中集成C/C++开发环境CDT
CDT的安装可以使我们在一个工程中,同时开发基于C/C++的Native代码和基于Java语言的壳,之后的配置还可以使得一次编译两部分代码。
下载:
下载地址:http://www.eclipse.org/cdt/downloads.php
说明:
Eclipse C/C++ IDE Indigo SR2:是带CDT的Eclipse开发环境。
p2 software repository:在线安装的地址。(似乎被河蟹爬了)
cdt-master-8.0.2.zip:这个是CDT的离线安装包。(推荐使用这个,保留离线包,复用)
离线安装:
Eclipse -> Help -> Install New Software,点击add。Name:随意,建议使用好记的“CDT_版本”。Location:点击Archive,定位到下载的“cdt-master-8.0.2.zip”文件。
错误:
如果Location的下面出现“Duplicate location”错误,请到Window -> preferences -> Install/Update -> Avaliable Software Site中找到该条,remove之。
验证:
安装完成后,在Eclispe中新建一个项目,如果出现了C/C++项目,则表明CDT插件安装成功了。
四、安装Sequoyah插件
Sequoyah插件用于设置Android工程对Native开发的支持。
官方网址:http://www.eclipse.org/sequoyah/downloads/
在线安装:
官网提供了用于在线安装的Update Site地址以及安装包的下载地址。貌似安装包才1M多,在线安装也没被河蟹爬过,直接在线安装了。勾选全部列出的可安装项并完成安装。
Location:http://download.eclipse.org/sequoyah/updates/2.0/
注意:
在安装界面不要勾选“Group items by category”复选框,默认是勾选的,出现了列表为空(There are no categorized items)的情况。
配置:
安装完Sequoyah插件后,为Android配置NDK路径。
在“window –> preferences ->Android -> 本机开发”中添加NDK的路径。
验证:
右键之前建立的“HelloJni”项目,在“Android Tools”选项中包含“Add Native Support…”选项即成功。
五、JNI编译环境配置
仍旧以之前建立的“HelloJni”为例,到目前为止,如果我们修改“/HelloJni/jni/hello-jni.c”文件,动态链接库libhello-jni.so文件却不会被重新编译生成。这是因为我们没有给JNI项目添加它需要的编译配置和依赖库。现在我们来配置它。
第一步:转换工程。点击“文件 -> 新建 -> 其他”(快捷键:Ctrl+N)。选择“C/C++”下的“Convert to a C/C++ Project(Adds C/C++ Nature)”。进入“下一步”。
第二步:选中你刚才建的“HelloJni”工程,下面左边选“Makefile project”右边选“Cygwin GCC”。确定后提示的“透视图”不清楚是什么,点击“是”即可。
第三步:在“HelloJni”工程上右键,选择“属性”。配置“C/C++ Build”和“C/C++ General -> Paths and Symbols”。
C/C++ Build:点击“C/C++ Build”,在右边的“Builder Settings”中去掉默认勾选的“Use default build command”复选框。设置Build command为“bash D:\Java\android-ndk-r8\ndk-build”。
C/C++ General -> Paths and Symbols:在Includes下add新的GNU C依赖路径。此“HelloJni”工程需要“D:\Java\android-ndk-r8\platforms\android-8\arch-arm\usr\include”即可,以后根据不同项目选择不同的依赖库。
验证:
将“/HelloJni/jni/hello-jni.c”中的字符串“Hello from JNI !”如改为“Hello JNI from Baron!”,运行后在模拟器上输出的字符串改变即说明配置成功。
‘伍’ Android用NDK和整套源码下编译JNI的不同
2. 注册函数的方法是不同的。举例说,在com/evan129/jnitest/jniutils.java有个native int foo()方法,需要在jni中实现
在ndk中,只要实现这个函数,然后函数名是以jint java_com_evan129_jnitest_jniutils_foo(jnienv* env, jobject thiz) 命名既可。也就是说,如果jni只要实现这个函数,并且功能也很简单的话,那么jni c/cpp文件里只需要这一个函数就完事了。
但在android源码中编译jni代码是不同的,jni中的函数名无所谓。不过至少还需要加一个
jniexport jint jnicall jni_onload(javavm* vm, void* reserved)方法,这个方法可以找个现有的复制一把就行,检查运行环境的。然后主要是这个方法中会调用(*env).registernatives函数,在这里把jni中的方法和java文件中的方法关联起来。
3. 有个很诡异的区别,自动传入的jnienv* env好像不是一个东西。因为在android源码中使用这个env一般是如env->newstringutf(…),而ndk中sample里的一处是(*env)->newstringutf(…) 这env和*env差很大。但两处函数传入的都是jnienv* env,只能怀疑jnienv的定义是不是都是不同的。