gdal庫的Android平臺(tái)編譯

一,準(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。

Ubuntu 16.04 LTS 下載地址

Android-ndk-r14b 下載地址

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文件夾下。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容