用NDK编译开源库的目的是得到.so文件,让JNI调用。编译的方法主要有两种:
1、书写Android.mk文件,使用ndk-build来编译。这种方法,关键在于书写Android.mk,对于工程复杂,目录复杂的源码,写Android.mk太费力,所以这种方法,很少用。
2、直接用NDK的GCC环境,利用开源库自己的configure / Makefile去编译。这个和一般的交叉编译没太多区别。
这里简单记录一下第二种方法。假设是在ubuntu环境,NDK的环境变量配置如下(在/etc/profile文件末尾添加):
export NDKROOT="/home/xxx/android-ndk-r8"
export PATH=$PATH:$NDKROOT
使用NDK的GCC编译开源项目:
(1)新建一个目录 install_dir(下面configure的--prefix选项会用到),用于存放编译后的头文件和库文件等。
xxx@ubuntu:~$ mkdir install_dir
(2)在终端设置NDK的GCC路径如下
xxx@ubuntu:~$ export SYSROOT=$NDKROOT/platforms/android-14/arch-arm
xxx@ubuntu:~$ export CC="$NDKROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc --sysroot=$SYSROOT"
(3)配置
进入开源项目根目录,执行configure
xxx@ubuntu:~/libupnp$ ./configure --host=arm --prefix=/home/xxx/install_dir/
或者用 --prefix 和 --exec-prefix 选项分别指定安装的头文件和库文件的位置,如下:
xxx@ubuntu:~/libupnp$ ./configure --host=arm --prefix=/home/xxx/install_dir/include/ --exec-prefix=/home/xxx/install_dir/lib/
注意:--host选项必须指定,否则configure会报错。
(4)编译和安装
xxx@ubuntu:~/libupnp$ make
xxx@ubuntu:~/libupnp$ make install
完成后,在configure的--prefix指定的install_dir文件夹中可以找到编译后得到的头文件和库文件。
(5)使用
若要使用编译出来的库,将install_dir中的头文件和库文件拷贝到自己的项目中,然后编写相应的Android.mk即可
关于如何调用第三方静态库动态库等的Android.mk的写法,可以参考android开发 NDK编译和使用静态库、动态库