Ahao's Technical Blog Ahao's Technical Blog
首页
  • 001.基础篇
  • 002.玩转AOSP篇
  • 003.学穿Binder篇
  • 004.基础组件篇
  • 005.系统启动过程分析
  • 006.Hal开发入门与实践
  • 007.显示系统
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

阿豪讲Framework

不积跬步无以至千里
首页
  • 001.基础篇
  • 002.玩转AOSP篇
  • 003.学穿Binder篇
  • 004.基础组件篇
  • 005.系统启动过程分析
  • 006.Hal开发入门与实践
  • 007.显示系统
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 基础篇

    • 001.Ubuntu 使用快速入门
    • 002.Make 构建工具入门
    • 003.Android 平台如何编译执行 C C++ 可执行程序
      • 源码
      • 参考资料
      • 关于
    • 004.Linux Shell 脚本编程入门1——核心基础语法
    • 005.Linux Shell 脚本编程入门2——脚本自动化基础
    • 006.JNI 编程上手指南之 JavaVM 详解
    • 007.JNI 编程上手指南之 JNI 数据类型
    • 008.JNI 编程上手指南之描述符
    • 009.JNI 编程上手指南之 JNIEnv 详解
    • 010.JNI 编程上手指南之 JavaVM 详解
    • 011.JNI 编程上手指南之字符串处理
    • 012.JNI 编程上手指南之数组访问
    • 013.JNI 编程上手指南之 Native 访问 Java
    • 014.JNI 编程上手指南之异常处理
    • 015.JNI 编程上手指南之从内存角度再看引用类型
    • 016.JNI 编程上手指南之 JNI 调用性能优化
    • 017.JNI 编程上手指南之多线程
    • 018.理解 C++ 的 Memory Order
  • 玩转AOSP篇

  • 学穿Binder篇

  • 基础组件篇

  • 系统启动过程分析

  • Hal开发入门与实践

  • 显示系统

  • Framework
  • 基础篇
阿豪
2023-07-03
目录

003.Android 平台如何编译执行 C C++ 可执行程序

视频课程与答疑服务请咨询微信号 zzh0838

我们直接看一个示例:

写一个 helloworld c++ 可执行程序:

main.c:

# include <iostream>

int main(int argc, char const *argv[])
{
  for(int i = 0; i < 5; ++i)
    std::cout << "Hello World" << std::endl;

  return 0;
}

1
2
3
4
5
6
7
8
9
10

Android 平台通常使用 CMake 调用 NDK 工具链编译 C/C++ 代码,具体地:

写 CMakeLists.txt: google 给了两种方式用于支持 CMake 调用 NDK 工具链编译 C/C++ 代码, 一种是 CMake的内置支持 (opens new window),需要 CMake 版本 >= 3.21,NDK 版本需要大于 r23,是未来的主流。 一种是通过工具链文件支持 (opens new window),是当前的主流。Android Gradle 插件使用的是 NDK 的工具链文件。

CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

project(main)

add_executable(${PROJECT_NAME} main.cpp )
1
2
3
4
5

编译脚本 build.sh:

export ANDROID_NDK=你的ndk完整路径

rm -r build
mkdir build && cd build 

# CMake的内置支持
# cmake -DCMAKE_SYSTEM_NAME=Android \
# 	-DCMAKE_SYSTEM_VERSION=29 \
# 	-DCMAKE_ANDROID_ARCH_ABI=x86_64 \
# 	-DANDROID_NDK=$ANDROID_NDK \
# 	-DCMAKE_ANDROID_STL_TYPE=c++_shared \
# 	..

# 工具链文件支持
cmake \
    -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
    -DANDROID_ABI=x86_64 \
    -DANDROID_PLATFORM=android-29 \
	-DANDROID_STL=c++_shared \
	..

cmake --build .
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

在模拟器上执行我们的程序:

# 编译程序
chmod +x build.sh
./build.sh
# 打开模拟器,流程略
# 上传可执行文件
adb push build/test /data/local/tmp
# 上传 STL 动态库
adb push 你的ndk完整路径/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/libc++_shared.so /data/local/tmp
# 进入到模拟器 shell
adb shell
# 执行程序
cd /data/local/tmp
export LD_LIBRARY_PATH=/data/local/tmp && ./test
1
2
3
4
5
6
7
8
9
10
11
12
13

# 源码

你可在我的 github 仓库 https://github.com/yuandaimaahao/AndroidFrameworkTutorial/tree/main/1.%E5%9F%BA%E7%A1%80%E7%AF%87/src/AndroidRunCpp 中下载到示例代码。

# 参考资料

  • [CMake 文档] Cross Compiling for Android with the NDK (opens new window)
  • Google CMake 文档 (opens new window)

# 关于

我叫阿豪,2015 年本科毕业于国防科学技术大学指挥信息系统专业,毕业后从事信息化装备的研发工作,主要研究方向是 Android Framework 与 Linux Kernel。

如果你对 Android Framework 感兴趣或者正在学习 Android Framework,可以关注我的微信公众号和抖音,我会持续分享我的学习经验,帮助正在学习的你少走一些弯路。学习过程中如果你有疑问或者你的经验想要分享给大家可以添加我的微信,我拉你进技术交流群。

002.Make 构建工具入门
004.Linux Shell 脚本编程入门1——核心基础语法

← 002.Make 构建工具入门 004.Linux Shell 脚本编程入门1——核心基础语法→

最近更新
01
如何调试 SurfaceFlinger
10-05
02
SurfaceFlinger 概述
10-05
03
HWC 接口分析
10-05
更多文章>
Theme by Vdoing | Copyright © 2020-2025 AHao Framework | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式