gdal庫的Android平臺編譯

一搔弄,準備工作

? ? ? ? 由于最近在做的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嘶朱。

Ubuntu 16.04 LTS 下載地址

Android-ndk-r14b 下載地址

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


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蛛勉,隨后出現的幾起案子鹿寻,更是在濱河造成了極大的恐慌,老刑警劉巖诽凌,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毡熏,死亡現場離奇詭異,居然都是意外死亡侣诵,警方通過查閱死者的電腦和手機痢法,發(fā)現死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門狱窘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人财搁,你說我怎么就攤上這事蘸炸。” “怎么了妇拯?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵幻馁,是天一觀的道長。 經常有香客問我越锈,道長仗嗦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任甘凭,我火速辦了婚禮稀拐,結果婚禮上,老公的妹妹穿的比我還像新娘丹弱。我一直安慰自己德撬,他們只是感情好,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布躲胳。 她就那樣靜靜地躺著蜓洪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坯苹。 梳的紋絲不亂的頭發(fā)上隆檀,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機與錄音粹湃,去河邊找鬼恐仑。 笑死,一個胖子當著我的面吹牛为鳄,可吹牛的內容都是我干的裳仆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼孤钦,長吁一口氣:“原來是場噩夢啊……” “哼歧斟!你這毒婦竟也來了?” 一聲冷哼從身側響起偏形,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤静袖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后壳猜,有當地人在樹林里發(fā)現了一具尸體勾徽,經...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡滑凉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年统扳,在試婚紗的時候發(fā)現自己被綠了喘帚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡咒钟,死狀恐怖吹由,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情朱嘴,我是刑警寧澤倾鲫,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站萍嬉,受9級特大地震影響乌昔,放射性物質發(fā)生泄漏。R本人自食惡果不足惜壤追,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一磕道、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧行冰,春花似錦溺蕉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肛走,卻和暖如春漓雅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背羹与。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工故硅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纵搁。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓吃衅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親腾誉。 傳聞我的和親對象是個殘疾皇子徘层,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359