需要编译的项目:GDAL2.4.4 + PROJ5.2.0 + SQLite3.22.0
一、安装NDK
从官网下载NDK https://developer.android.google.cn/ndk/downloads
解压并配置环境变量,我的路径是 /usr/local/android-ndk
,可以写到 /etc/profile
里,更改配置重新 source /etc/profile
就行了。
export NDK_HOME=/usr/local/android-ndk/android-ndk-r21
创建独立工具链
!/bin/bash platform=android-19 shmake=$NDK_HOME/build/tools/make-standalone-toolchain.sh archs=( 'arm' 'x86' ) toolchains=( 'arm-linux-androideabi-4.9' 'x86-4.9' ) echo $NDK_HOME num=${#archs[@]} for ((i=0;i<$num;i++)) do sh $shmake --arch=${archs[i]} --platform=$platform --install-dir=/home/sean/Android/android-toolchain/${archs[i]} --toolchain=${toolchains[i]} done
配置工具链环境变量(更换编译架构需要重启一下重新设置变量)
export TOOLCHAIN_HOME=/home/sean/Android/android-toolchain/arm export NDK_HOME=/usr/local/android-ndk/android-ndk-r21 export PATH=$PATH:$TOOLCHAIN_HOME/bin
二、编译GDAL
从GDAL官网下载源码:https://gdal.org/download.html
为了精简到核心功能,这里我们用到的是2.4.4版本(如果使用3.x版本,需要先编译安装对应架构的 PROJ.6,然后加上编译参数 --with-proj=" 你的PROJ6路径 ")
)下面是编译 arm v7 架构的配置,移除了不必要的功能。配置输出的结尾应该能看到
Statically link PROJ: no
这样我们的 GDLAL2.4.4 编译完成后就是动态链接 PROJ 的了。
CC="arm-linux-androideabi-gcc" CXX="arm-linux-androideabi-g++" LDFLAGS="-march=armv7-a -Wl,--fix-cortex-a8" CFLAGS="-mthumb" CXXFLAGS="-mthumb" LIBS="-lstdc++" ./configure --prefix=/home/sean/gdal2/Android/arm --host=arm-linux-androideabi --with-unix-stdio-64=no --with-ogr --with-geos --with-hide-internal-symbols --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-sde --without-sqlite3 --without-webp --without-xerces --without-xml2
然后 make
编译和 make install
安装到对应目录,这样我们就完成了GDAL的编译工作。
三、SQLite
官网下载源码: https://www.sqlite.org/download.html
因为PROJ依赖于SQLite3,因此同样编译对应架构的 SQLite3,安装到指定目录。
CC="arm-linux-androideabi-gcc" CXX="arm-linux-androideabi-g++" LDFLAGS="-march=armv7-a -Wl,--fix-cortex-a8" CFLAGS="-mthumb" CXXFLAGS="-mthumb"./configure --prefix=/home/sean/sqlite3/Android/arm --host=arm-linux-androideabi
编译完成后还要将安装目录下 lib 文件夹下面的库文件合并到工具链对应 {ANDROID_ABI}/lib
目录下,这么做是为了解决PROJ编译时报错 ld 找不到 -lsqlite3(后面已经手动指定目录,不知道该错误产生的原因,如果有了解的请留言)
我的路径为: /home/sean/Android/android-toolchain/arm/arm-linux-androideabi/lib
四、PROJ
因为GDAL的某些功能依赖于PROJ,所以我们需要编译对应的PROJ动态库进行链接。因为GDAL更新日志中提到了对PROJ.5的支持,但没提到过PROJ.6及更高版本,这里就用PROJ.5。
官网PROJ下载: https://proj.org/download.html
由于工具链的 ld 不包含我们的 sqlite3 目录,这里就手动指定 include 和 lib。
LOCAL_LDFLAGS="-L/home/sean/sqlite3/Android/arm/lib/libsqlite3.a" CC="arm-linux-androideabi-gcc -I/home/sean/sqlite3/Android/arm/include" CXX="arm-linux-androideabi-g++ -I/home/sean/sqlite3/Android/arm/include" LDFLAGS="-march=armv7-a -Wl,--fix-cortex-a8" CFLAGS="-mthumb" CXXFLAGS="-mthumb" LIBS="-lstdc++ -L/home/sean/sqlite3/Android/arm/lib/libsqlite3.a" ./configure --prefix=/home/sean/proj5/Android/arm --host=arm-linux-androideabi
至此,我们有了 libgdal.a 、libproj.so 两个库以及相关头文件。我们只要在 Android 项目中集成就行了。CMake相关部分配置(注意 .so 动态库必须放在 jniLib 下,静态库这里是放在了自定义的 jni 目录,头文件放在了自定义的 inc 目录):
add_library(proj SHARED IMPORTED) set_target_properties(proj PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libproj.so) add_library(gdal STATIC IMPORTED) set_target_properties(gdal PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../jni/lib/${ANDROID_ABI}/libgdal.a) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/inc/${ANDROID_ABI}/) target_link_libraries(YOUR_LIB android proj gdal log)
五、GEOS
安装对应架构GEOS后在GDAL配置中添加
--with-geos=/home/sean/geos/Android/arm/bin/geos-config
使用时链接GEOS的动态库即可。