一搔弄,準備工作
? ? ? ? 由于最近在做的Gis行業(yè)的安卓客戶端的需要郁油,需要把gdal_2.3.1庫編譯成安卓平臺Arm64_v8a版本的.so庫该肴。由于要求是對AndroidNDK版本 12以上轴脐,Android API 21以上的支持膜楷。在此次的編譯過程中,參考了同樣簡書上的這篇文章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
?在終端命令行里面依次輸入以下命令安裝相應的工具救军。
?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解壓到某個路徑下,并配置環(huán)境變量唱遭。本文通過修改/etc/profile文件來進行配置戳寸。
通過以下命令打開配置文件
sudo gedit /etc/profile
末尾添加環(huán)境變量(具體的路徑根據自己的NDK存放路徑自行調整):
export ? NDK_HOME=/home/myubuntu/Software/android-ndk-r14b
export ? PATH=$NDK_HOME:$PATH?
執(zhí)行下面的命令讓環(huán)境變量立即生效source /etc/profile
測試環(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、? ? 進入并切到 /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 平臺21以上跌穗,--install-dir= 后面接指定的生成路徑,也就是說生成工具鏈存放路徑虏辫。--arch=arm64 指定工具鏈為arm64蚌吸, 生成的為arm64-v8a版本的庫。如果你想生成32位版本的工具鏈可以指定為arm,編譯的動態(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命令讓設置生效。
三佩微,交叉編譯
1缝彬、執(zhí)行.configure命令?
進入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等常用庫會報錯導致編譯不過,--host后接aarch64-linux-android表示調用交叉編譯工具鏈的android64位的編譯器進行編譯,? ? --prefix后接生成的相應文件路徑奶卓,在此一疯,本人將相應的文件生成在了gdal解壓文件下。
執(zhí)行后夺姑,一定要在終端打印的內容中搜索看到? checking whether we are cross compiling... yes墩邀,這一行才算成功。
2盏浙、進行編譯并安裝眉睹。
make
make? install
3、生成java文件和需要的c只盹、c++文件
cd? swig ?
make? ANDROID=yes
cd? java ?
make ANDROID=yes ?
在編譯java中的命令時辣往,會出現如下錯誤:
處理方法如下圖
處理方法:按照報錯文件路徑找到相應的文件并注釋掉上圖的三行代碼,并重新輸入命令 make ANDROID=yes
四殖卑、編譯Android能用的so文件
1站削、在gdal文件夾下新建jni文件夾
2、拷貝源文件(注意:源文件的地址根據自己電腦的情況設置)
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文件,并寫入下面的內容
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文件园细,并寫入下面的內容
APP_STL := gnustl_static
APP_CFLAGS := Android.mk
APP_ABI := arm64-v8a
APP_PLATFORM := android-21
5、進行編譯
ndk-build
6接校、編譯成功
.so文件自動生成到了libs文件夾下猛频。