Android工控应用:双进程编译通讯方案

网安智编 厦门萤点网络科技 2026-04-08 00:10 1 0
是移动设备的主流操作系统,近年来越来越多的工业领域的客户开始关注基于操作系统的设备在工控领域的应用。鉴于是基于Linux内核的事实,我们发展了一种以双应用进程为特色的工控应用方案,并在工控主板上加以实现。具体说来,就是在Linux平台上运行...

是移动设备的主流操作系统,近年来越来越多的工业领域的客户开始关注基于操作系统的设备在工控领域的应用。鉴于是基于Linux内核的事实,我们发展了一种以双应用进程为特色的工控应用方案,并在工控主板上加以实现。具体说来,就是在Linux平台上运行一个直接操作硬件接口的控制通讯管理进程,为保证运行效率,该进程采用C/C++语言编写(以下简称C进程或控制进程);另一方面在平台采用标准Java语言编写一个人机界面进程(以下简称Java进程)。底层的控制进程并不依赖与上层的Java进程而独立运行,两个进程之间通过本地IP进行通讯,控制进程处于服务器侦听模式,Java进程则为客户端模式。本方案的主要优点是客户可以直接继承已有的现成应用程序作为底层控制进程的基础,仅仅增加标准的侦听功能,即可快速完成新的底层应用程序的设计。而界面的Java程序,由于不再涉及具体的工控硬件接口,属于单纯的程序,编程难度也大大降低。

我们将通过多篇技术报告来具体介绍双进程方案在主板上实现的相关技术。本文是《双应用进程工控方案》的第一篇,主要介绍在环境中,如何编译C/C++应用程序,下载并配置为开机启动程序。

本文PDF下载:双应用进程工控方案(一)——在平台启动Linux C/C++应用程序

1、重新编译C/C++应用程序

如图1所示,由于传统的Linux程序依赖的是glibc库,而程序需要的是谷歌公司在AOSP( Open )中提供的库(比glibc小,提供了特定的函数)。所以,原来Linux上的C/C++程序要运行在系统上,必须要在的编译环境中重新编译。英创推荐使用官方开发工具 ,下载CMake和NDK工具,进行C/C++程序的重新编译。

图1 和Linux依赖库区别

下面开始介绍使用 的NDK编译工具重新编译C/C++程序的过程。

1.1 搭建 NDK编译环境

的安装具体过程请参考文档《 应用开发简介》的第一章,在SDK Tools页面中一定要勾选NDK和CMake。

1.2 在 中新建C++项目

图2 新建C++项目

首先新建一个 项目,并勾选 C++ 选项,此处的 name是 app的名字,与最终需要的C++程序无关,用户可随意设定。然后一直点击下一步“Next”,直到图3页面,使用默认的工具链,点击。

图3 默认工具链

点击后会进入项目编辑页面,进入到图4所示的项目视图,可以看到所有的目录结构,其中app/src/main/cpp目录、app/build.和app/.txt是用户需要编辑修改的。然后,点击左上角File >> 进入图5的页面,检查NDK环境路径是否正确设置。

图4 项目目录结构及要修改的文件

图5 环境路径设置检查

1.3 复制C/C++应用程序源码

将原C/C++应用程序的所有源文件拷贝到app/src/main/cpp目录。

1.4 修改.txt

新的 已经支持使用cmake编译c++项目,这里提供对于简单项目使用的.txt,对于更复杂的需求,用户可以参考cmake官网文档自行修改。

app/.txt:

ed( 3.4.1)

# 5.0 以上需要在此处设置PIE

set( "${} -fPIE")

set(GS "${GS} -fPIE -pie")

# 头文件目录

(

src/main/cpp

# 源文件目录

(src/main/cpp )

# 添加要编译的可执行文件

( ${})

其中,表明要生成的是可执行文件,名字为,源文件为变量代表的文件,而将src/main/cpp目录下的所有文件赋给了变量。

1.5 修改build.

app/build.文件主要是设置构建app的一些参数,这里主要往android>> defaultConfig>>externalNativeBuild>>cmake添加和两个参数。其中,表示生产目标文件的名字,与.txt中的相同;表示要生产哪种cpu架构下的目标文件,这里使用-v7a。修改之后会在右上角提示需要同步项目,点击即可。

图6 修改build.

1.6 编译cpp项目

在 中直接使用Build>>Make 即可编译整个项目,包括cpp和java。生成的目标文件在目录app/./cmake/debug/-v7a目录下,名字为。

1.7 下载目标文件到

集成了开发的所有工具,在 中使用adb push命令可以将编译得到的目标文件下载到目标板上。首先,要使用u*** otg的调试线连接PC和目标板;然后点击左下角的窗口会弹出所在项目的命令行窗口;输入命令:

adb push app.-o      /data/local

这样,便下载到了目标板的/data/local目录下。这时,使用adb shell登陆到目标板的命令行,修改目标文件的运行权限并运行,整个过程如图7所示。程序正常运行起来后,表明整个编译过程没有问题,用户可以在命令行中按Ctrl+c停止运行应用程序,并输入exit命令退出adb shell登陆,然后进行下一步的开机自启动配置。

图7 下载目标文件到

2、开机自启动配置

上电后通过uboot引导进入linux内核,内核完成一系列系统配置后会启动第一个用户进程:init进程。相关的启动过程也是从init开始的。在init进程中会挂载的文件系统,运行init.rc脚本。init进程启动过后,会fork出子进程去开启init.rc文件中配置的。

为了满足用户运行不同名字的应用程序,英创在init.rc中配置了一个服务。服务开机自动运行,具体过程用户不用关心。 要想开机自启动C/C++程序,用户只需要做两件事:

编辑.txt文件

Android工控应用方案_双应用进程C/C++编译Android_android应用程序编译

复制.txt以及C/C++程序的目标文件到指定目录//

2.1 编辑.txt

启动后,服务会自动检测///.txt文件。如果.txt文件存在,会去解析并启动.txt文件中指定的应用;如果.txt不存在,则结束服务。.txt起到一个配置文件的作用,其格式如下:

Name=

Param=2

其中,Name指定程序名字,Param指定要带的参数,没有可以不写。用户可以直接在 中创建并编辑.txt文件。

图8  中新建.txt

2.2 复制.txt以及C/C++程序到指定目录//

系统中,不是每个目录都有读写以及可执行的权限,这里我们选择//作为存储.txt和C/C++程序的指定目录。复制.txt以及C/C++程序到指定目录有两种方法:通过u***_otg接口使用 的adb push命令下载到,或者通过U盘从PC端拷贝到。用户按其中一种方法下载文件到指定目录后,重启即可以开机启动.txt中指定的C/C++程序。

1、 命令行下载.txt和C/C++程序到

使用 命令行下载文件到,首先需要使用调试线连接PC和目标板的u***_otg接口。然后,在 的窗口输入:

adb push app.-o      //

adb push .txt  //

重启设备即可实现开机自启动。

2、U盘拷贝.txt和C/C++程序到

使用U盘拷贝.txt和C/C++程序到,只需要将.txt和目标文件()拷贝到U盘,插到的USB接口上,打开的文件管理应用ES File ,将.txt和拷贝到//目录,重新启动即可。

2.3 查看程序是否开机运行

通过以上设置之后,开机=1之后会启动应用程序,用户可以通过命令adb shell登陆控制台,输入命令 | grep init.svc | grep 来查看服务的运行状态;当然实际运行的应用程序的进程状态可以通过ps | grep 查看。

图9 检测服务运行状态

3、Q & A

Q1:查看C/C++程序输出

在控制台上看不到开机启动的C/C++程序输出信息,开发中如何在上调试C/C++程序?

A1:使用kill命令终止掉已经启动的C/C++程序;然后,在命令行中执行命令:user.sh,即可手动启动C/C++应用程序,并且C/C++应用程序的输出信息将打印到控制台。

Q2:关于.txt和C/C++程序指定目录的说明

A2:.txt和C/C++程序指定目录要具有读写可执行权限,在2.2节中,adb push命令将C/C++应用程序()下载到了//目录,其实下载到/data/local也是可以的,而U盘却只能拷贝到///。这是因为服务会比较///是否比/data/local/更新,如果是,则先用新文件覆盖旧文件,再运行/data/local/。因此,使用adb push命令的指定目录用///或者/data/local都是可以的;而使用U盘,则受限于ES File 应用不能访问/data/local目录,只能拷贝到//。

Q3:关于 的窗口

A3: 的窗口在进入的时候,工作在PC的文件系统上,操作的文件都是PC上的;当使用adb shell登陆目标板之后,工作在目标板的文件系统上,操作的文件、执行的命令都是目标板上的;在使用adb shell登陆之后,可以使用exit命令退出登陆状态,返回到PC端的工作目录。

Q4:adb连接不上设备

使用adb 查看一下是否有已连接的设备;检查u***_otg和PC端的物理连接;重新插拔一下调试线或者重启系统。

如果正常工作,可以使用代替u***_otg,在中输入一下命令:

$ adb u***

in USB mode

$ adb

List of

$ adb tcpip 5555

in TCP mode port: 5555

$ adb

to :5555

$ adb

List of

:5555

退出:

adb

Q5:常用命令

查看所有运行状态: | grep init.svc

adb相关:

adb   查看u***_otg已连接的设备

adb push 将PC端的下载到端的目录下。

adb pull 复制端的文件到PC端的当前目录

本文PDF下载:双应用进程工控方案(一)——在平台启动Linux C/C++应用程序