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阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342