一,準(zhǔn)備工作
? ? ? ? 由于最近在做的Gis行業(yè)的安卓客戶端的需要,需要把gdal_2.3.1庫編譯成安卓平臺(tái)Arm64_v8a版本的.so庫。由于要求是對(duì)AndroidNDK版本 12以上,Android API 21以上的支持。在此次的編譯過程中,參考了同樣簡(jiǎn)書上的這篇文章GDAL for Android 從編譯到讀寫shp,感謝作者提供的思路。
? ? ? ? 所以在本次編譯過程中全部需要使用64位的操作系統(tǒng),NDK及編譯器,編譯環(huán)境為 操作系統(tǒng):Ubuntu 16.04 LTS,安卓NDK版本:android-ndk-r14b,gdal版本:gdal_2.3.1。
二,編譯環(huán)境搭建
1、安裝 g++,swig, ant和openjdk
?在終端命令行里面依次輸入以下命令安裝相應(yīng)的工具。
?sudo apt-get? update?
?sudo apt-get? install g++
?sudo apt-get? install swig ??
?sudo apt-get? install ant ??
?sudo apt-get? install openjdk-8-jdk
2、NDK環(huán)境搭將下載好的NDK解壓到某個(gè)路徑下,并配置環(huán)境變量。本文通過修改/etc/profile文件來進(jìn)行配置。
通過以下命令打開配置文件
sudo gedit /etc/profile
末尾添加環(huán)境變量(具體的路徑根據(jù)自己的NDK存放路徑自行調(diào)整):
export ? NDK_HOME=/home/myubuntu/Software/android-ndk-r14b
export ? PATH=$NDK_HOME:$PATH?
執(zhí)行下面的命令讓環(huán)境變量立即生效source /etc/profile
測(cè)試環(huán)境變量命令ndk-build -v如果NDK的版本信息如下,就說明是配置正確:
GNU Make3.81
Copyright (C)2006Free Software Foundation, Inc.
This is free software;?
see the source? for? copying conditions.
There is NO warranty;? not? even? for? MERCHANTABILITY? or? FITNESS? FOR APARTICULAR PURPOSE.
This program builtforx86_64-pc-linux-gnu
3、交叉編譯的環(huán)境搭建
3.1、? ? 進(jìn)入并切到 /home/myubuntu/SoftWare/android-ndk-r14b/build/tools 目錄。
執(zhí)行如下命令
? ?? ./make-standalone-toolchain.sh --platform=android-21--install-dir=$/home/ubuntu/toolchains_android/android-arrch64 --arch=arm64?
? ? ? --platform=android-21 指定Android 平臺(tái)21以上,--install-dir= 后面接指定的生成路徑,也就是說生成工具鏈存放路徑。--arch=arm64 指定工具鏈為arm64, 生成的為arm64-v8a版本的庫。如果你想生成32位版本的工具鏈可以指定為arm,編譯的動(dòng)態(tài)庫就為armeabi-v7a版本。
? 3.2, 配置交叉編譯的環(huán)境變量
export? TOOLCHAIN_HOME=/home/ubuntu/toolchains_android/android-arrch64
export ? PATH=$TOOLCHAIN_HOME/bin:$PATH
export ? LIBS="-lstdc++ -liconv -lgnustl_shared"
TOOLCHAIN_HOME 后接生成的工具鏈路徑。
執(zhí)行source /etc/profile命令讓設(shè)置生效。
三,交叉編譯
1、執(zhí)行.configure命令?
進(jìn)入gdal的解壓路徑下,打開Terminal,執(zhí)行如下命令:
LIBS="-lsupc++ -lstdc++" ./configure --host=aarch64-linux-android --prefix=/home/ubuntu/software/gdal-2.3.1--without-gif --with-ogr --with-geos --with-libz=internal
注意:LIBS="-lsupc++ -lstdc++"必須加上,否則遇到STL等常用庫會(huì)報(bào)錯(cuò)導(dǎo)致編譯不過,--host后接aarch64-linux-android表示調(diào)用交叉編譯工具鏈的android64位的編譯器進(jìn)行編譯,? ? --prefix后接生成的相應(yīng)文件路徑,在此,本人將相應(yīng)的文件生成在了gdal解壓文件下。
執(zhí)行后,一定要在終端打印的內(nèi)容中搜索看到? checking whether we are cross compiling... yes,這一行才算成功。
2、進(jìn)行編譯并安裝。
make
make? install
3、生成java文件和需要的c、c++文件
cd? swig ?
make? ANDROID=yes
cd? java ?
make ANDROID=yes ?
在編譯java中的命令時(shí),會(huì)出現(xiàn)如下錯(cuò)誤:

處理方法如下圖

處理方法:按照?qǐng)?bào)錯(cuò)文件路徑找到相應(yīng)的文件并注釋掉上圖的三行代碼,并重新輸入命令 make ANDROID=yes
四、編譯Android能用的so文件
1、在gdal文件夾下新建jni文件夾
2、拷貝源文件(注意:源文件的地址根據(jù)自己電腦的情況設(shè)置)
cd /home/myubuntu/gdal/jni
cp /home/myubuntu/gdal/Android/lib/libgdal.a ./
mkdir -p gdal
cp -r /home/myubuntu/gdal/Android/include gdal
cp /home/myubuntu/gdal/gdal-2.1.4/swig/java/*_wrap.cpp ./
cp /home/myubuntu/gdal/gdal-2.1.4/swig/java/gdalconst_wrap.c ./
cp -r /home/myubuntu/gdal/gdal-2.1.4/swig/java/org ../jniwrap/
cp /home/myubuntugdal/gdal-2.1.4/swig/java/gdal.jar ../jniwrap/
其中jniwrap為Java代碼的源文件和jar包。
3、在jni目錄下通過sudo gedit Android.m創(chuàng)建Android.mk文件,并寫入下面的內(nèi)容
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := gdal
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/gdal/include
LOCAL_SRC_FILES := libgdal.a
LOCAL_EXPORT_LDLIBS := -lz
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := gdaljni
LOCAL_SRC_FILES := gdal_wrap.cpp
LOCAL_STATIC_LIBRARIES := gdal
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := gdalconstjni
LOCAL_SRC_FILES := gdalconst_wrap.c
LOCAL_STATIC_LIBRARIES := gdal
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := ogrjni
LOCAL_SRC_FILES := ogr_wrap.cpp
LOCAL_STATIC_LIBRARIES := gdal
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := osrjni
LOCAL_SRC_FILES := osr_wrap.cpp
LOCAL_STATIC_LIBRARIES := gdal
include $(BUILD_SHARED_LIBRARY)
4、jni目錄下通過sudo gedit Application.mk創(chuàng)建Application.mk文件,并寫入下面的內(nèi)容
APP_STL := gnustl_static
APP_CFLAGS := Android.mk
APP_ABI := arm64-v8a
APP_PLATFORM := android-21
5、進(jìn)行編譯
ndk-build
6、編譯成功
.so文件自動(dòng)生成到了libs文件夾下。
