• Mac下cmake使用Android编译


    1. 环境准备

    对于Android开发来说Android studio是必备工具,网上的教程也很多,这里就不再讲述安装过程;
    对于NDK的安装在macOS 12以上的系统有些麻烦,这里补充下:

    • ndk下载地址:NDK下载下图安装包:
      在这里插入图片描述

    • 下载完成后打开,校验完成后,在安装界面直接把 AndroidNDK8775105.app 拖到FinderApplication目录,如下图所示流程:

    • 在Finder的应用程序中找到刚才安装的程序,左键,选择显示包内容,如下:
      在这里插入图片描述
      这个路径就可以配置到.bash_profile或者.zshrc等文件的环境变量中,由于这里是在camke中使用就不用配置;

    2. Android编译shell脚本

    1. 在shell脚本中定义变量:
     export ANDROID_NDK=/Applications/AndroidNDK8775105.app/Contents/NDK
    
    • 1
    1. ANDROID_NDK后面的变量是NDK的安装路径,在脚本后面使用;
      在脚本开始检查cmake是否安装:
    if ! [ -x "$(command -v cmake)" ]; then
      echo 'Error: cmake is not installed.' >&2
      echo '请安装 cmake'
      #   if ! [ -x "$(command -v brew)" ]; then
      #     echo 'Error: brew is not installed.' >&2
      #     echo '开始安装 brew 如果长时间无响应,需要访问外网'
      #     /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
      #   fi
      # echo '开始安装 cmake 如果长时间无响应,需要访问外网'
      # export HOMEBREW_NO_AUTO_UPDATE=true
      # brew install cmake
      exit -1
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    按照上面的方式就可以检查是否安装cmake命名行支持;通过文中注释的部分也可以通过brew命令通过brew安装cmake(注释掉原因,测试的时候一直安装失败);

    1. 处理命令行输入参数选择编译的是Android还是linux库,从而执行不同的cmake指令:
    if [ $1 == '-linux' ]
    then
       clear_build
       echo " build_linux=====>"
       # 如果这里不是在bulid目录下,
       # cd bulid/
       build_linux
    
      echo " 运行测试程序=====>"
      cd linux/
      ./main
    elif [ $1 ==  '-android' ]
    then
      clear_build
      echo " build_android=====>"
      # 如果这里不是在bulid目录下,
       # cd bulid/
      build_android
    
    else
      echo "Pleasemake sure the positon variable is linux or Android."
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    1. cmake执行指令如下:
    function build_android(){
      echo  'current path: '`pwd`
      echo 'cmake====>'
    # arm64-v8a armeabi-v7a
        cmake ..  -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
            -DANDROID_NDK=$ANDROID_NDK  \
            -DANDROID_ABI=arm64-v8a \
            -DANDROID_TOOLCHAIN=clang++ \
            -DANDROID_PLATFORM=android-21 \
            -DCMAKE_BUILD_TYPE=debug \
    
    
        echo 'build====>'
        cmake --build . --config Release
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    通过上述脚本中替换DANDROID_ABI的架构类型就可以编译指定架构的库;

    3. Android相关的CMakelist文件

    1. cmake中定义一些变量
      # cmake 自带变量 设置编译类型为release
    set(CMAKE_BUILD_TYPE Release)
    # 工程名
    set(PROJECT_NAME test)
    MESSAGE( STATUS "CMAKE_CXX_FLAGS: " ${CMAKE_CXX_FLAGS} )
    # 显示的定义变量
    set(SRC_FILES main.c);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. 分别指定Android和linux库的路径
    if  (NOT ANDROID )
        MESSAGE(STATUS "====》Now is linux")
       ...省略
    else()
       MESSAGE(STATUS "====》Now is android")
     # 类似c中#define BUILD_ANDROID
     add_definitions(-DBUILD_ANDROID)
       # 设置生成的库文件目录,这里我们设置成和库目录相同
       include_directories( include 
         。。。省略
       )
       set(LIBRARY_OUTPUT_PATH android)
       # 生成库文件例如 .aar  .a等
       # 语法 add_library(libName [SHARED|STATIC] source source 1)
       add_library( ${PROJECT_NAME} SHARED ${SRC_FILES}
                   )
    
               #然而在Android NDK编译中这样会报错提示找不到pthread
    #  这是因为Android NDK中posix线程库被归纳到了c++库中
      target_link_libraries( ${PROJECT_NAME} c android log)
    
                   # 配置可执行文件到安装路径 CMAKE_INSTALL_PREFIX的bin中
       install(TARGETS  ${PROJECT_NAME} DESTINATION  ${CMAKE_CURRENT_SOURCE_DIR}/build/android )
    endif( )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
  • 相关阅读:
    总结 | Revit安装失败的常见问题及解决办法
    基于java+springboot+vue实现的在线试题库系统(文末源码+Lw)108
    Lwip之SNMP协议与实现
    【超简单实用】Zotero 7 内置pdf背景颜色更改插推荐以及安装
    HTB-Late
    【Meetup预告】OpenMLDB+OneFlow:链接特征工程到模型训练,加速机器学习模型开发
    关系型数据库之 MySQL 详解:从入门到精通【面试圣经】
    【OpenCV 例程200篇】215. 基于多段线绘制近似椭圆
    【Rust日报】2022-08-12 用 Rust 为 Linux 编写新的 Apple Silicon GPU 驱动程序
    Qt5开发从入门到精通——第四篇十三节(程序启动画面 )
  • 原文地址:https://blog.csdn.net/lym594887256/article/details/126007414