GDAL-Android交叉编译armV7

前言

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

准备NDK

NDK官网下载解压
命令行找到NDK下面build/tool/make-standalone-toolchain.sh

./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年左右的各种不适合现在的版本。希望此文能帮助大家。有疑问的地方欢迎留言讨论。

你可能感兴趣的:(GDAL-Android交叉编译armV7)