前言

仅考虑GDAL-OGR部分已经ArmV7平台

准备NDK

./make-standalone-toolchain.sh --toolchain=arm-linux-androideabi-4.9 --arch=arm --platform=android-15 --system=windows-x86_64 --install-dir=/cygdrive/d/android/android-toolchain-15-armv7 --ndk-dir=//cygdrive/d/android/android-ndk-r10e

其中,--arch选项有 arm arm64 x86,具体官网看,一般使用arm(armV7a)

--system 貌似在最新版本中不使用了,脚本会自动检测,自己试试,如果报错就删除,如果没报错就设置为自己电脑的平台(如windows-x86_64、)

--platform=android-15 安卓目标平台,想要在多少版本运行就选多少

--install-dir 编译后产生的对应独立工具链存放的位置,自己设置

--toolchain 可以省略,设置--arch即可

使用

1、上述产生假如生成文件夹是armV7a,将其 bin 文件夹路径添加到环境变量

2、设置JAVA_HOME环境变量,不确定,最好名字就用这个

3、设置NDK环境变量,就是下载的那个如:xxxx/android-ndk-r10e,我用的是这个版本

其他:

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"

这里需要保证NDK环境变量有没设置正确,比如可以再命令行输入ndk-build验证

安装 apache-ant-1.9.9 并配置环境变量

安装并配置 Swig环境变量

检查上述,如果各个命令都成功了进入下一步

configure

GDAL官网下载GDAL(我用的2.0.3,2.1.4貌似也是可以的,但别用2.2.1报的错我没有找到修改的办法,如果还是有不撞南墙不回头的勇士要用2.2.1,希望成功了以后告诉我方法)

解压到任意目录,cd进去。配置config.guess config.sub两个文件,参考这里,但是命令不要照搬,用Mac的同学,没有wget的话,可以用其他浏览器打开config.guess config.sub两个文件的网址直接下载替换即可。

重点configure配置

sudo ./configure --prefix=/xxx/xxx/xx

--prefix 是存放编译生成的 a 文件的路径,自己取

--with-ogr --with-geos (只需要OGR的同学)须加上,需要其他模块的自己选择,参照配置这里提一下,如果全部都编译,完了a文件200+mb。如果只需要OGR,就把链接里面的那一段全部加上

最后切记,使用mac的同学加上“--with-unix-stdio-64=no”,否则很坑爹,其他系统没试过,附上所有配置:

./configure --prefix=/xxxxxx/EXTOGR --with-ogr --with-geos --host=arm-linux-androideabi --with-unix-stdio-64=no

--with-geotiff=internal

--with-hide-internal-symbols

--with-libtiff=internal

--with-libz=internal

--with-threads

--without-bsb

--without-cfitsio

--without-cryptopp

--without-curl

--without-dwgdirect

--without-ecw

--without-expat

--without-fme

--without-freexl

--without-gif

--without-gif

--without-gnm

--without-grass

--without-grib

--without-hdf4

--without-hdf5

--without-idb

--without-ingres

--without-jasper

--without-jp2mrsid

--without-jpeg

--without-kakadu

--without-libgrass

--without-libkml

--without-libtool

--without-mrf

--without-mrsid

--without-mysql

--without-netcdf

--without-odbc

--without-ogdi

--without-openjpeg

--without-pcidsk

--without-pcraster

--without-pcre

--without-perl

--without-pg

--without-php

--without-png

--without-python

--without-qhull

......

此处还有很多 without 去官网复制,这样编译下来a文件才会减小

重点是 --prefix=/xxxxxx/EXTOGR --with-ogr --with-geos --host=arm-linux-androideabi --with-unix-stdio-64=no\

这里有三个配置 --build --host --target,规则是这样如果都不配置(build是自动推断为电脑的平台,然后host=build 然后target=host)显然这不符合要求。应该这样:

不设置build让脚本自己推断,host设置为安卓的arm-linux-androideabi,如果是x86 或者arm64 和mip 等等自己修改。

--prefix 编译结果输出路径

--with-threads 加上

--with-unix-stdio-64=no Mac必加,其他平台不清楚

执行configure后的最后几行

Statically link PROJ.4: no

enable OGR building: yes

enable pthread support: yes

enable POSIX iconv support:no

hide internal symbols: yes

其中 enable POSIX iconv support 不知道是搞什么的,为no也没关系,其中有一项checking whether we are cross compiling... yes如果是YES 说明是正确的,否则就要小心了,编译处理来的就有问题)再次感谢CSDN lvshiyu21,不过我是没找到。只要之前的操作没问题,就不会错

剩下的就是参考这里,继续make install make lib-target ...

期间,会遇到这个样的错误在执行 make ANDROID=yes的时候,就是GDALTest.java (好像是282行)找不到xxx函数。直接进去注释了(不知道会遇到啥问题。但是我看那个是ColorTable,是应该是栅格数据中用到的,我的需求是矢量数据所以直接注释了)

最后建一个文件夹建一个jni,配置Android.mk Application.mk 跟着他操作就 会得到 Swig编译的 jni接口和so库。然后就是使用了。将so(如armeabi-v7a 编译得到的)放入工程的 /src/main/jniLibs jar包(在gdal源码目录中)放入libs 注意设置 jniLibs.srcDirs jni.srcDirs ,自行百度。

以及

ndk {

abiFilters "armeabi-v7a"

}

如果一切顺利就能使用gdal了。

没有中文乱码问题!!发现中文乱码问题可以去查找arcgis的补丁!已确认10.2.2中打过补丁的arcgis生成的shape不会乱码。读写都不会。

感谢我要出国敲代码和我一起在尝试解决这个问题。如果看见这里的人,有编译高手,请提出以上操作的问题和不足,欢迎指教。我自己在编译这方面就是个菜。只是多次尝试撞墙后,和大家分享一下经验。确实是撞得个头破血流,网上教程都是13年左右的各种不适合现在的版本。希望此文能帮助大家。有疑问的地方欢迎留言讨论。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐