美文网首页Android技术
gdal linux环境下的android 全编译

gdal linux环境下的android 全编译

作者: 揽月凡尘 | 来源:发表于2019-04-08 10:23 被阅读0次

    相关参考
    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

    相关文章

      网友评论

        本文标题:gdal linux环境下的android 全编译

        本文链接:https://www.haomeiwen.com/subject/ajmyiqtx.html