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。