为什么80%的码农都做不了架构师?>>>   

之前开发 Android 下的二进制程序都是开个 jni 目录, 手写 Android.mk, 然后调用 ndk-build 生成可执行文件, 这样的步骤. 但最近的工程需要用到 Lua 解析器执行 Lua 脚本, 因此需要处理的文件就多了, 再继续闷头写 Android.mk 就显得效率很低. 况且 CLion 也是通过 CMake 构建工程的, 因此就打算试试看能不能通过 CMake 来构建 Android 下的可执行文件.

结果当然是 OK, 现将基本配置记录如下.

基础环境

  • Ubuntu 14.04
  • CMake 3.3.0
  • android-ndk-r10e-linux-x86_64

准备 NDK Standalone Toolchain

虽然 NDK 的 prebuilt 目录中有提供编译链工具, 但使用起来并不方便. 所幸 NDK 还提供了一个可生成独立编译链工具的脚本. 因此先通过该脚本生成独立编译链.

$NDK/build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-androideabi-4.8 --install-dir=~/app/ndk_toolchain

该脚本的大部分选项都有默认值, 一般只需指定这两个参数就行了:

--toolchain 该参数用于设置要使用的编译链, 在 $NDK/toolchains 目录下可以看到所有支持的编译链工具

--install-dir 制定生成的编译链工具的安装位置

好, 有了编译链工具后下面就简单了.

编写 CMakeLists.txt

cmake_minimum_required(VERSION 3.3)
project(demo)set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99")# Android 5.0 以上需要在此处设置 PIE
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIE")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fPIE -pie")# 配置使用 NDK Standalone Toolchain 编译
set(NDK_STANDALONE_TOOLCHAIN ~/app/ndk_toolchain)
set(CMAKE_SYSTEM_NAME AndroidARM)
set(CMAKE_SYSTEM_VERSION 3)
set(CMAKE_C_COMPILER ${NDK_STANDALONE_TOOLCHAIN}/arm-linux-androideabi/bin/gcc)
set(CMAKE_CXX_COMPILER ${NDK_STANDALONE_TOOLCHAIN}/arm-linux-androideabi/bin/g++)
set(CMAKE_FIND_ROOT_PATH ${NDK_STANDALONE_TOOLCHAIN})# 使用 NDK 提供的头文件
add_definitions("--sysroot=${NDK_STANDALONE_TOOLCHAIN}/sysroot")aux_source_directory(src SOURCE_FILES)
add_executable(demo ${SOURCE_FILES})

到此就大功告成了, 是不是很简单啊? 当然也可以在 CMakeLists.txt 里加个开关来切换 x86 和 arm 平台, 方便调试, 在此就不再赘述了.

转载于:https://my.oschina.net/gotax/blog/516861

利用 CMake 和 NDK 交叉编译 Android 下的可执行程序相关推荐

  1. Cmake NDK交叉编译Android平台程序

    当我们需要把我们的C++程序编译成Android平台的so库时,就需要用到交叉编译,有两种方法 目录 一:利用NDK进行编译 1.首先安装NDK 2.直接cmake, 二,独立的交叉编译工具链 1.安 ...

  2. NDK开发-Android下摄像头YUV数据获取与H264编码(FFmpeg、x264)总结

    涉及知识点: Camera2 API使用 YUV420P与YUV420SP(NV21)格式转换 h264文件格式 FFmpeg工程 x264解码器 这次就先记录一下开发过程,因为牵涉到的很多技术问题都 ...

  3. 深入理解使用CMake编译 NDK 程序

    使用 CMake 进行Android NDK编译的原理 介绍 Android Studio 2.2 及以后的版本默认使用CMake进行 NDK 编译, 其中最吸引人的地方是,在开发NDK程序时可以进行 ...

  4. android 能调用gcc_如何在命令行下使用Android NDK交叉编译工具

    我们知道,在Linux下可以使用gcc来把一份C代码编译成为Linux上的可执行程序, 如: $ gcc -o main.out main.c 而Android平台提供了NDK工具包来交叉编译可以运行 ...

  5. 如何在命令行下使用Android NDK交叉编译工具

    我们知道,在Linux下可以使用gcc来把一份C代码编译成为Linux上的可执行程序, 如: $ gcc -o main.out main.c 而Android平台提供了NDK工具包来交叉编译可以运行 ...

  6. NDK交叉编译及so库导入Android项目

    前言 记录 NDK交叉编译及so库导入Android项目 的简单步骤,以备后续用到时查看. 环境 在Linux和Mac环境下,分别编译输出so库. Red Hat Enterprise Linux 8 ...

  7. 【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )

    文章目录 I . 动态库 与 静态库 II . 编译动态库 III. Android Studio 使用第三方动态库 IV . Android Studio 关键代码 V . 博客资源 I . 动态库 ...

  8. Android NDK开发之旅(2):一篇文章搞定Android Studio中使用CMake进行NDK/JNI开发

    Android NDK开发之旅(2):一篇文章搞定android Studio中使用CMake进行NDK/JNI开发 (码字不易,转载请声明出处:http://blog.csdn.NET/andrex ...

  9. 【Android NDK 开发】Ubuntu 函数库交叉编译 ( Android 动态库交叉编译 | Android 静态库交叉编译 )

    文章目录 I . Ubuntu 中交叉编译 Android 动态库 II . Ubuntu 中交叉编译 Android 静态库 I . Ubuntu 中交叉编译 Android 动态库 1 . 要编译 ...

最新文章

  1. php插入数据进度条,PHP导入进度条类
  2. 用lisp编写串口助手源代码_实战用python来写个串口助手--界面篇
  3. 再来一次的C语言贪吃蛇小游戏(三)
  4. 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型...
  5. 在控制台输出九九乘法表
  6. 第三章关系数据库标准语言SQL
  7. java只允许一个用户登陆_spring boot security只允许一个用户(test1)登录
  8. 学习GRPC(一) 简单实现
  9. 【转载】GIT教程 猴子都能懂得git入门
  10. 事务的四大特性( A C I D )
  11. Hadoop之仿写搜索引擎
  12. python-json校验-jsonpath
  13. 蠕虫勒索软件WannaCrypt0r的行为分析
  14. Anaconda创建环境中途退出后重新创建出错
  15. eCharts——柱状图中的柱体颜色渐变
  16. 厨师 做菜 java_经验丰富的厨师有哪些日常做饭技巧?
  17. Code Project
  18. Git分支的创建,切换及分支指针移动的理解
  19. 会声会影2023旗舰版新增七大功能介绍
  20. miniui展示日历能点击_南怀瑾先生2021日历,人生难题问南师!

热门文章

  1. python声明_【瞎折腾-03】在Python里面写类型“声明”
  2. Deep learning:卷积神经网络之卷积计算、作用与思想
  3. Python的生成器(generator)
  4. 全球及中国香蕉连接器行业投资商机与前景趋势展望报告2022版
  5. 中国水果加工行业产销格局与开发价值分析报告2022版
  6. 上海国际区块链赋能传统产业峰会-王伟:道道人才链启动
  7. LuoguP3959 宝藏 题解
  8. centons7编译安装zabbix3.4【转https://www.cnblogs.com/kowloon/p/7771495.html】
  9. mysql为datetime类型的字段设置默认值current_timestamp,引发 Invalid default value for 错误...
  10. Django框架使用