用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編譯和使用靜態庫、動態庫