美文网首页
在linux上用cmake交叉编译helloWorld到andr

在linux上用cmake交叉编译helloWorld到andr

作者: book_02 | 来源:发表于2020-08-07 19:16 被阅读0次

前面的一个文章(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

相关文章

网友评论

      本文标题:在linux上用cmake交叉编译helloWorld到andr

      本文链接:https://www.haomeiwen.com/subject/mglqdktx.html