当前位置: 首页 > ds >正文

OrangePi Zero 3学习笔记(Android篇)2 - 第一个C程序

目录

1. 创建项目文件夹

2. 创建c/cpp文件

3. 创建Android.mk/Android.bp文件

3.1 Android.mk

3.2 Android.bp

4. 编译

5. adb push

6. 打包到image中


在AOSP里面添加一个C或C++程序,这个程序在Android中需要通过shell的方式运行。

1. 创建项目文件夹

首先需要选择一个文件夹添加自己的目录,优先选择device文件夹对应方案内(需要避免添加到system文件夹)。

2. 创建c/cpp文件

新建文件helloworld.cpp(在VSCode + SSH中)

内容如下:

#include <stdio.h>
#include <stdlib.h>int main()
{printf("Hello World, Android C/C++\n");return 0;
}

3. 创建Android.mk/Android.bp文件

Android.mk是makefile文件,和Linux下是一样的,而Android.bp是Android设计的格式,功能和mk一样。

3.1 Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \helloworld.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_MODULE := helloworld
include $(BUILD_EXECUTABLE)

其中可能需要修改的部分有:LOCAL_SRC_FILES、LOCAL_C_INCLUDES和LOCAL_MODULE。

LOCAL_SRC_FILES是c/cpp源代码文件列表

LOCAL_C_INCLUDES是指定头文件目录路径,

3.2 Android.bp

cc_binary {name: "HelloWorld",srcs: ["helloworld.cpp",],
}
  • cc_binary:编译成二进制可执行文件,类似于Android.mk中的BUILD_EXECUTABLE。
  • name:编译出的模块的名称,类似于Android.mk中的LOCAL_MODULE。
  • srcs:源文件,类似于Android.mk中的LOCAL_SRC_FILES。

4. 编译

进入这个文件夹,通过mmm编译。

完成后可以在/out/target/product/apollo-p2/obj/EXECUTABLES/helloworld_intermediates下找到编译后的执行文件。

5. adb push

在Ubuntu中通过adb push将生成的执行文件拷贝到Zero 3中。

$ adb push helloworld /product/app/helloworld: 1 file pushed, 0 skipped. 11.1 MB/s (2820 bytes in 0.000s)adb: error: failed to copy 'helloworld' to '/product/app/helloworld': remote couldn't create file: Read-only file system

目标位置不能写,应该是adb没有权限写product/app目录。

adb root
adb remount

重新执行push命令后成功。

回到Zero 3 shell界面,需要返回上一级目录再进入这个文件夹,这时候可以看到helloworld执行文件。执行./helloworld后提示

 在串口shell里面运行

chmod 0777 helloworld

提示操作不允许,因为此时adb还拥有权限,回到Ubuntu的adb界面,进入adb shell界面。

adb shell
cd product/
cd app/
chmod 0777 helloworld
./helloworld

此时可以看到打印信息:

退出adb shell,回到串口shell可以再次运行helloworld:

6. 打包到image中

通过make编译源代码和pack打包,对应的执行文件才能打包到image中,默认的位置没找到(System/bin?没确认这个结果)。

可以在bp文件中添加product_specific: true指定生成到product文件夹内。

cc_binary {name: "HelloWorld",srcs: ["helloworld.cpp",],product_specific: true
}

然后在apollo_p2.mk文件中添加PRODUCT_PACKAGES += HelloWorld

PRODUCT_PACKAGES += DragonAtt
PRODUCT_PACKAGES += SoundRecorder
PRODUCT_PACKAGES += HelloWorld

其中HelloWorld对应bp文件里面的name。

http://www.xdnf.cn/news/4720.html

相关文章:

  • 创建需求跟踪矩阵5大常见步骤(附注意事项)
  • linux - shell脚本编程
  • 解锁 AI 生产力:Google 四大免费工具全面解析20250507
  • vue3+ts的watch全解!
  • 登顶中国:基于 Trae AI与 EdgeOne MCP 的全国各省最高峰攀登攻略博客构建实践
  • 比较入站和出站防火墙规则
  • 使用Apache Spark在Java中进行日志分析
  • 如何快速获取旺店通奇门原始数据至本地
  • 掌握Multi-Agent实践(二):基于AgentScope构建支持@机制的群聊系统,实现定向对话机制
  • LeetCode 热题 100 322. 零钱兑换
  • CATIA高效工作指南——零件建模篇(二)
  • 多边形生成立面点云
  • Python理财应用-- A股指标对比 | AKShare【未完待续】
  • 【视觉基础模型-SAM系列-1】Segment Anything
  • std::atomic<bool>与bool的区别
  • AI Agent四大范式:解锁智能体的进化密码
  • 算法探索:合并区间问题深度解析
  • nRF Connect SDK system off模式介绍
  • FEKO许可使用效率分析
  • 微服务架构详解
  • 掌握Multi-Agent实践(一):使用AgentScope实践入门和Workstation上手指南
  • 快速上手知识图谱开源库pykeen教程指南(一)
  • element-plus中,vue3项目,el-input密码框禁止浏览器自动弹出浏览器历史密码提示框
  • 华清远见陶金华受邀武汉大学讲座: 共话“算力下沉”时代,赋能AloT技术新未来
  • 【大模型面试每日一题】Day 11:参数高效微调方法(如LoRA、Adapter)的核心思想是什么?相比全参数微调有何优缺点?
  • 【行业】一些名词
  • 双11美妆数据分析
  • 双指针思路
  • 使用频域变换轻松压缩kv-cache
  • pip安装包时出现网络问题的坑