一、前文
很多好的或开源的库都是用C/C++写的,有时候在android中也需要用到这些库,因此需要交叉编译。
本文指的交叉编译比较狭隘,仅仅只指在android开发中使用C/C++库而已。
二、概念介绍
1、NDK
android官方对NDK的定义是:The NDK is a toolset that allows you to implement parts of your app using native-code languages such as C and C++
简单来讲,就是允许你在android中使用C/C++的一个工具集。
下载地址:http://developer.android.com/tools/sdk/ndk/index.html
2、JNI
Java native interface-java本地调用,是java平台的一部分
它的存在,允许java和其他语言进行交互
其实主要用处是方便java使用本地已编译的C/C++语言
如何使用jni此处不介绍,后面再挖坑
3、cygwin
维基百科对cygwin的定义:Cygwin是许多自由软件的集合,最初由Cygnus Solutions开发,用于各种版本的Microsoft Windows上,运行UNIX类系统。Cygwin的主要目的是通过重新编译,将POSIX系统(例如Linux、BSD,以及其他Unix系统)上的软件移植到Windows上。
可以粗糙地理解为一个重编译软件。(因为NDK里面的ndk-build是不可以在windows下直接执行的,需要重编译)
三、在android中使用C/C++库
1、安装ndk
很简单,此处不介绍。
2、安装cygwin
安装可以参考本人的:http://www.cnblogs.com/arthur3/p/3244901.html
步骤:
①下载cygwin安装(比较耗时,不需要更新的注意就不要更新了)
②关联ndk
找到文件C:\cygwin\home\用户名\.bash_profile
修改,增加变量
ANDROID_NDK_ROOT=/cygdrive/d/android-ndk-r5b
export ANDROID_NDK_ROOT
其中d/android-ndk-r5b是ndk的路径
然后进入cygwin测试一下
这里就已经进入NDK的目录了
注意:
在cygwin里访问windows的目录注意前面都要加上/cygdrive这个路径(像前面定义ANDROID_NDK_ROOT时就加了)
C:\cygwin\home\用户名\.bash_profile只是一般路径,也可能在别的地方,也可能没有,如果没有,就自己新建一个,然后把修改的内容增加进去。我第二次安装的时候cygwin下面的home文件夹就是空的,于是我把搜索并修改了之后的.bash_profile文件夹放了进去。新建文件夹%USERPROFILE%(这个是我的home地址)
然后再修改环境变量为新建后的文件夹即可。
③最后,修改一下ndk的环境变量
修改环境变量path,增加ndk的路径
④以上,cygwin就已经配置完成。用ndk自带的例子检验一下
cd $ANDROID_NDK_ROOT cd samples/hello-jni $ANDROID_NDK_ROOT/ndk-build
这样,就可以在hello-jni下看到libs文件夹,armeabi里面就生成了libhello-jni.so文件
这个生成的.so文件就是动态库,类似于dll,可以被java所调用。
注:实际上命令$ANDROID_NDK_ROOT/ndk-build还是太长了,可以将命令重命名,方便使用。
alias NDK_BUILD='$ANDROID_NDK_ROOT/ndk-build'
这样以后直接使用NDK_BUILD这个命令即可(cygwin的操作其实基本就是linux命令操作,熟悉基本命令还是很有必要滴,会使自己方便很多)
3、使用cygwin编译C/C++库
以上,需要的东西都准备好了。(jni已经写好),假设你的app工程projectA下src目录下有个C写的库b
①进入jni的父目录
一般也就是你的工程目录
②ndk-build
完成之后,你就会发现你工程的libs文件夹下生成了相应的armeabi/libb.so
这样在eclipse中projectA就可以直接调用库b里的接口了。
四、其他
好吧,前天我是说昨天写这个的,但是还是拖到了今天(可怕的拖延症>_<)
还是老样子,先挖坑留地,明天简单介绍一下jni的使用。