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. 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

按照上面的方式就可以检查是否安装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. 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
}

通过上述脚本中替换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. 分别指定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( )

猜你喜欢

转载自blog.csdn.net/lym594887256/article/details/126007414