前面的一个文章(https://www.jianshu.com/p/ad94dcdeaf41)总结了在ubuntu上交叉编译helloWorld到arm64的android手机上去。
使用的方法是直接调用指定的编译器。
这里再总结一个使用cmake进行交叉编译的方式,感觉使用cmake更方便一些。
这里NDK用的是r19及以上的版本。
1. 安装NDK
从下面的链接下载NDK,并解压:
https://developer.android.google.cn/ndk/downloads/
这里下载了 android-ndk-r21b,解压到 /home/temp/programs/android-ndk-r21b
2. 写main.cpp文件
连打5个"Hello World"
#include <iostream>
int main(int argc, char const *argv[])
{
for(int i = 0; i < 5; ++i) {
std::cout << "Hello World" << std::endl;
}
return 0;
}
3. 写CMakeLists.txt
跟普通的cmake文件一样
cmake_minimum_required(VERSION 3.0)
project(hello_cmake)
add_definitions("-Wall -g")
add_executable(${PROJECT_NAME} main.cpp )
install(TARGETS ${PROJECT_NAME}
RUNTIME DESTINATION ${PROJECT_SOURCE_DIR})
4. 写交叉编译脚本 generate.sh
也可直接在命令行里写。写在脚本里方便查看和修改。
新建generate.sh,并给执行权限 : chmod +x generate.sh
#/bin/bash
export ANDROID_NDK=/home/temp/programs/android-ndk-r21b
rm -r build
mkdir build && cd build
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
-DANDROID_ABI="arm64-v8a" \
-DANDROID_NDK=$ANDROID_NDK \
-DANDROID_PLATFORM=android-26 \
..
make && make install
cd ..
这里是重点,主要要配置好cmake的那几个选项参数。
CMake和NDK搭配使用时,可以配置的部分变量如下:
编译参数 | 说明 |
---|---|
CMAKE_TOOLCHAIN_FILE | 进行交叉编译的android.toolchain.cmake文件的路径,默认在$NDK/build/cmake/目录 |
ANDROID_ABI | 目标ABI,可设置为armeabi-v7a、arm64-v8a、x86、x86_64,默认armeabi |
ANDROID_PLATFORM | 指定目标Android平台的名称,如android-18指定Android 4.3(API级别18) |
ANDROID_NDK | 安装的NDK根目录的绝对路径 |
ANDROID_STL | 指定CMake应使用的STL,默认c++_static |
ANDROID_PIE | 指定是否使用位置独立的可执行文件(PIE)。Android动态链接器在Android 4.1(API级别16)及更高级别上支持PIE,可设置为On、OFF |
ANDROID_CPP_FEATURES | 指定CMake编译原生库时需使用的特定C++功能,可设置为rtti(运行时类型信息)、exceptions(C++异常) |
ANDROID_ALLOW_UNDEFINED_SYMBOLS | 指定CMake在构建原生库时,如果遇到未定义的引用,是否会引发未定义的符号错误。默认FALSE |
ANDROID_ARM_NEON | 指定CMake是否应构建支持NEON的原生库。API级别为23或更高级别时,默认值为true,否则为false |
ANDROID_DISABLE_FORMAT_STRING_CHECKS | 指定是否在编译源代码时保护格式字符串。启用保护后,如果在printf样式函数中使用非常量格式字符串,则编译器会引发错误。默认false |
ANDROID_TOOLCHAIN | CMake使用的编译器工具链,默认为clang |
CMAKE_BUILD_TYPE | 配置构建类型,可设置为Release、Debug |
ANDROID_NATIVE_API_LEVEL | CMake进行编译的Android API级别 |
CMAKE_LIBRARY_OUTPUT_DIRECTORY | 构建LIBRARY目标文件之后,CMake存放这些文件的位置 |
一般情况下,只需要配置ANDROID_ABI、ANDROID_NDK、CMAKE_TOOLCHAIN_FILE、ANDROID_PLATFORM四个变量即可。
为什么指定ANDROID_PLATFORM?如果不指定,Android平台版本较低,此时ANDROID_PIE默认为OFF,可执行程序无法执行
交叉编译出可执行程序hello_cmake
./generate.sh
5. 放到手机上执行
5.1 安装adb工具
ubuntu下 :
sudo apt install android-tools-adb android-tools-fastboot
5.2 push到手机
adb push hello_cmake /data/local/tmp
5.3 给hello执行权限
adb shell
cd /data/local/tmp
chmod +x hello_cmake
5.4 执行hello
./hello_cmake
可以看到输出
Hello World
Hello World
Hello World
Hello World
Hello World
6. 参考
https://www.iambigboss.top/post/49094_1_1.html
https://developer.android.com/ndk/guides/cmake
网友评论