1. 环境准备
对于Android开发来说Android studio
是必备工具,网上的教程也很多,这里就不再讲述安装过程;
对于NDK的安装在macOS 12以上的系统有些麻烦,这里补充下:
-
ndk下载地址:NDK下载下图安装包:
-
下载完成后打开,校验完成后,在安装界面直接把
AndroidNDK8775105.app
拖到Finder
的Application
目录,如下图所示流程: -
在Finder的应用程序中找到刚才安装的程序,左键,选择显示包内容,如下:
这个路径就可以配置到.bash_profile
或者.zshrc
等文件的环境变量中,由于这里是在camke中使用就不用配置;
2. Android编译shell脚本
- 在shell脚本中定义变量:
export ANDROID_NDK=/Applications/AndroidNDK8775105.app/Contents/NDK
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(注释掉原因,测试的时候一直安装失败);
- 处理命令行输入参数选择编译的是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
- 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文件
- 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);
- 分别指定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( )