2021年5月28日 12:57
@weijiz 你好,我想请教下一个问题。现在我有一个Android 10.0的源码工程,想移植采用cmake编译的项目到这个工程上,Android.bp文件要怎么写才能运行cmake命令?
很多c++和c程序都使用cmake去管理程序依赖和编译程序。新版本的cmake已经支持 cross compile 程序到android平台。我们可以利用ndk和cmake很方便的移植程序。下面是一个移植的例子。
因为新版本的ndk已经默认使用clang进行编译了
安装方式参照这里
wget -q https://github.com/Kitware/CMake/releases/download/v3.14.0-rc4/cmake-3.14.0-rc4.tar.gz
tar -xzf cmake-3.14.0-rc4.tar.gz
cd cmake-3.14.0-rc4/
env CC=$(which clang) CXX=$(which clang++) ./bootstrap --prefix=/usr --parallel=4
make
sudo make install
cd ..
wget -q https://dl.google.com/android/repository/android-ndk-r18b-linux-x86_64.zip
unzip -qq android-ndk-r18b-linux-x86_64.zip
export NDK_ROOT=$(pwd)/android-ndk-r18b
toolchain文件是cmake用来设置编译工具链的文件。配置好此文件就可以让cmake cross compile android 程序了。
toolchain.cmake文件内容如下
# 设置编译Android
set(CMAKE_SYSTEM_NAME Android)
# 设置Android NDK 路径
set(CMAKE_ANDROID_NDK $ENV{NDK_ROOT})
# 设置 Android ABI
set(CMAKE_ANDROID_ARCH_ABI armeabi-v7a)
# 设置target api版本
set(CMAKE_SYSTEM_VERSION 19)
# 设置cmake寻找路径,自己随便创建一个文件夹, 依赖的相关库文件也要放在这里
set(CMAKE_FIND_ROOT_PATH /opt/arm)
# 设置cmake搜寻文件的方式,防止使用系统中的其他不相干文件
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
和正常编译方式差别不大,只要加上toolchain参数就可以了
mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=$TOOLCHAIN_ROOT/toolchain.cmake -DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX ..
TOOLCHAIN_ROOT是你的toolchain文件路径, INSTALL_PREFIX是之前设置的CMAKE_FIND_ROOT_PATH。这样就可以cross compile Android程序了。
@weijiz 你好,我想请教下一个问题。现在我有一个Android 10.0的源码工程,想移植采用cmake编译的项目到这个工程上,Android.bp文件要怎么写才能运行cmake命令?
@shaokangfeng 我没用过android.bp,我的是直接cmake在android studio外编译的。