gdal linux環境下的android 全編譯

相關參考
Asen_十足壞蛋的GDAL for Android 從編譯到讀寫shp
預先說明

  • gdal 版本為2.3.1 編譯的so版本為arm-v7a
  • 操作系統為在Virtual Box 6.0上安裝的ubuntu-16.04.1-desktop-amd64.iso 版本
  • 本次編譯中依賴的第三方庫編譯包括proj、geos、expat、kml、json-c、sqlite

準備工作

  • Virtual Box 虛擬機
  • Ubuntu 16.04 LTS
  • NDK R10e
  • Gdal 2.3.1

下載地址:
http://download.osgeo.org/gdal/2.3.1/gdal231.zip

  • libcurl (網絡通信庫,解決wms等文件的讀寫問題)
  • geos 庫(幾何算法庫)
  • expat (xml解析庫,GML、GPX文件讀取)
  • KML庫

下載地址:
https://github.com/google/libkml

編譯環境搭建

  • 安裝swig、ant、jdk
sudo apt-get install swig
sudo apt-get install ant
sudo apt-get install openjdk-8-jdk

注:

  • swig的主要作用是將c++的申明文件自動生成c文件調用并且生成對應的java文件
  • openjdk-8-jdk 用于java文件的編譯
  • NDK 環境配置
  • 將NDK下載解壓,并設置NDK_HOME的環境變量
export NDK_HOME=/home/lanmo/android-ndk-r10e
export PATH=$NDK_HOME:$PATH
  • 交叉環境構建

由于NDK默認是有很多版本的構建的,如果不指定構建版本,需要做很多配置工作才可完成,構建交叉工具鏈的目的就是為了編譯各種開源庫的便利。

創建make_toolchain.sh 腳本并將一下內容復制到文件中保存,執行腳本,執行完成之后會在用戶的根目錄下生成一個android-toolchain的文件夾,內部有arm和arm64兩個文件夾

export NDK_HOME=/home/lanmo/android-ndk-r10e

platform=android-21
shmake=$NDK_HOME/build/tools/make-standalone-toolchain.sh

archs=(
    'arm'
    'arm64'
)

toolchains=(
    'arm-linux-androideabi-4.9'
    'aarch64-linux-android-4.9'
)

echo $NDK_HOME
num=${#archs[@]}
for ((i=0;i<$num;i++))
do
   sh $shmake --arch=${archs[i]} --platform=$platform --install-dir=$HOME/Android/android-toolchain/${archs[i]} --toolchain=${toolchains[i]}
done
android-toolchain.png

配置交叉編譯的環境變量(此處先以arm進行編譯,可自行更改為android-toolchain中的其他文件夾):

export TOOLCHAIN_HOME=/home/lanmo/Android/android-toolchain/arm
export PATH=$TOOLCHAIN_HOME/bin:$PATH
export LIBS="-lstdc++ -liconv -lgnustl_shared"
export CC=arm-linux-androideabi-gcc
export CXX=arm-linux-androideabi-g++
export CXXFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16"
export CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16"
export LDFLAGS="-march=armv7-a -Wl,--fix-cortex-a8"

常用android庫編譯

大部分的android庫的編譯都可以使用以下步驟來完成(主要測試有sqlite、geos、curl、proj、expat)庫,其他的如libspatialite、freexl 由于沒有對android的交叉編譯環境設置,配置會出錯


libspatialite、freexl出錯報告.png
  • 1、進入源碼目錄,執行configure
LIBS="-lsupc++ -lstdc++" ./configure --host=arm-linux-androideabi --enable-shared=yes
  • 執行make
make
  • 執行make install
sudo make install

注:直接執行會報以下錯誤

image.png

很多人遇到這個錯誤的時候會將配置改成以下方式 --prefix=某個目錄

LIBS="-lsupc++ -lstdc++" ./configure --host=arm-linux-androideabi --enable-shared=yes

但是使用此方法的缺點非常明顯,GDAL庫不能識別這些庫的目錄,在gdal的configure 中需要一個個去指定路徑,如--with-geos=/home/lanmo/Android/lib/geos/lib/pkg-config/geos-config 這種方法也不是特別靠譜,不是所有的路徑都可以正確的識別到。因此此方法行不通。
sudo make install出現錯誤的原因是root是系統的環境,而交叉編譯使用的是用戶的環境,我們要安裝的路徑應該是用戶的路徑,所以會導致識別不了用戶的環境變量導致安裝出錯。

//正確的解決辦法
$ sudo passwd 
Password: <--- 輸入安裝時那個用戶的密碼 
Enter new UNIX password: <--- 新的Root用戶密碼 
Retype new UNIX password: <--- 重復新的Root用戶密碼 
passwd:已成功更新密碼

這樣就可以通過su切換成功了之后直接調用make install即可,安裝后的路徑為

image.png

注:
通過該方法一次編譯成功的有proj、geos、expat、json-c、sqlite 對于kml需要指定curl的頭文件和lib的路徑

LIBS="-lsupc++ -lstdc++" ./configure --host=arm-linux-androideabi --enable-shared=yes --with-expat-include-dir=/home/lanmo/Android/lib/expat/include     --with-expat-lib-dir=/home/lanmo/Android/lib/expat/lib --prefix=/home/lanmo/Android/lib/kml

gdal so編譯

  • 進入gdal的解壓路徑,執行 configure命令
CFLAGS="-mthumb" CXXFLAGS="-mthumb"  LIBS="-lsupc++ -lstdc++" ./configure --host=arm-linux-androideabi --prefix=/home/lanmo/Android/lib/gdal  --with-threads --with-ogr  --with-geos  --with-libz=internal --with-curl --with-sqlite3 --with-static-proj4 --with-expat  --with-libkml

執行 configure命令之后可以看到:


image.png

其中sqlite,expat、kml、proj都是已經編輯進去了。

  • 進行編譯并安裝,安裝的路徑在上面的--prefix=后面配置
make
make install
  • 生成java文件和需要的c、c++文件
cd swig
make ANDROID=yes
cd java
make ANDROID=yes

在編譯java中的命令時,會出現如下錯誤:

image
image

處理方法:刪掉報錯類中報錯的地方,重新make ANDROID=yes。

編譯Android能直接鏈接的so文件(使用NDK鏈接的方式供JAVA調用)

mkdir jni

cd /home/lanmo/gdal_2.3.1/jni

# copy library bin and wrappers:
cp /home/lanmo/Android/lib/gdal/lib/libgdal.so ./

#copy wrappers
cp /home/lanmo/gdal-2.3.1/swig/java/*_wrap.cpp ./
cp /home/lanmo/gdal-2.3.1/swig/java/gdalconst_wrap.c ./

# copy headers
cp -r /home/lanmo/gdal-2.3.1/swig/java/org ../jniwrap/
cp /home/lanmo/gdal-2.3.1/swig/java/gdal.jar ../jniwrap/

注:此步驟根據實際情況修改

  • 創建Android.mk文件,并寫入下面的內容
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := gdalalljni
LOCAL_SRC_FILES := gdal_wrap.cpp gdalconst_wrap.c ogr_wrap.cpp osr_wrap.cpp
LOCAL_C_INCLUDES := /home/lanmo/Android/lib/gdal/include /home/lanmo/Android/lib/proj/include

#LOCAL_SHARED_LIBRARIES  LOCAL_LDLIBS
LOCAL_LDLIBS := -L$(LOCAL_PATH) -lgdal
include $(BUILD_SHARED_LIBRARY)
  • 創建Application.mk文件,并寫入下面的內容
APP_STL := gnustl_static
APP_CFLAGS := Android.mk
APP_ABI := armeabi-v7a
APP_PLATFORM := android-21
  • 編譯成功


    image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,380評論 2 379