Android是移動設(shè)備的主流操作系統(tǒng),近年來越來越多的工業(yè)領(lǐng)域的客戶開始關(guān)注基于Android操作系統(tǒng)的設(shè)備在工控領(lǐng)域的應(yīng)用。鑒于Android是基于Linux內(nèi)核的事實,我們發(fā)展了一種以雙應(yīng)用進程為特色的Android工控應(yīng)用方案,并在ESM6802工控主板上加以實現(xiàn)。具體說來,就是在Linux平臺上運行一個直接操作硬件接口的控制通訊管理進程,為保證運行效率,該進程采用C/C++語言編寫(以下簡稱C進程或控制進程);另一方面在Android平臺采用標(biāo)準Java語言編寫一個人機界面進程(以下簡稱Java進程)。底層的控制進程并不依賴與上層的Java進程而獨立運行,兩個進程之間通過本地IP進行通訊,控制進程處于服務(wù)器偵聽模式,Java進程則為客戶端模式。本方案的主要優(yōu)點是客戶可以直接繼承已有的現(xiàn)成應(yīng)用程序作為底層控制進程的基礎(chǔ),僅僅增加標(biāo)準的Socket偵聽功能,即可快速完成新的底層應(yīng)用程序的設(shè)計。而界面的Java程序,由于不再涉及具體的工控硬件接口,屬于單純的Android程序,編程難度也大大降低。
我們將通過多篇技術(shù)報告來具體介紹雙進程方案在ESM6802主板上實現(xiàn)的相關(guān)技術(shù)。本文是《Android雙應(yīng)用進程工控方案》的第一篇,主要介紹在Android環(huán)境中,如何編譯C/C++應(yīng)用程序,下載并配置為開機啟動程序。
本文PDF下載:Android雙應(yīng)用進程工控方案(一)——在Android平臺啟動Linux C/C++應(yīng)用程序
1、重新編譯C/C++應(yīng)用程序
如圖1所示,由于傳統(tǒng)的Linux程序依賴的是glibc庫,而Android程序需要的是谷歌公司在AOSP(Android Open Source Project)中提供的Bionic庫(比glibc小,提供了Android特定的函數(shù))。所以,原來Linux上的C/C++程序要運行在Android系統(tǒng)上,必須要在Android的編譯環(huán)境中重新編譯。英創(chuàng)推薦使用Android官方開發(fā)工具Android Studio,下載CMake和NDK工具,進行C/C++程序的重新編譯。
圖1Android和Linux依賴庫區(qū)別
下面開始介紹使用Android Studio的NDK編譯工具重新編譯C/C++程序的過程。
1.1搭建Android Studio NDK編譯環(huán)境
Android Studio的安裝具體過程請參考文檔《Android Studio 應(yīng)用開發(fā)簡介》的第一章,在SDK Tools頁面中一定要勾選NDK和CMake。
1.2在Android Studio中新建C++項目
圖2新建C++項目
首先新建一個Android Studio項目,并勾選Include C++ support選項,此處的Application name是Android app的名字,與最終需要的C++程序無關(guān),用戶可隨意設(shè)定。然后一直點擊下一步“Next”,直到圖3頁面,使用默認的工具鏈,點擊Finish。
圖3默認工具鏈
點擊finish后會進入項目編輯頁面,進入到圖4所示的項目視圖,可以看到所有的目錄結(jié)構(gòu),其中app/src/main/cpp目錄、app/build.gradle和app/CMakeLists.txt是用戶需要編輯修改的。然后,點擊左上角File >> Project Structure進入圖5的頁面,檢查NDK環(huán)境路徑是否正確設(shè)置。
圖4項目目錄結(jié)構(gòu)及要修改的文件
圖5環(huán)境路徑設(shè)置檢查
1.3復(fù)制C/C++應(yīng)用程序源碼
將原C/C++應(yīng)用程序的所有源文件拷貝到app/src/main/cpp目錄。
1.4修改CMakeLists.txt
新的Android Studio已經(jīng)支持使用cmake編譯c++項目,這里提供對于簡單項目使用的CMakeLists.txt,對于更復(fù)雜的需求,用戶可以參考cmake官網(wǎng)文檔https://cmake.org/cmake/help/v3.4/自行修改。
app/CMakeLists.txt:
cmake_minimum_required(VERSION 3.4.1)
# Android 5.0 以上需要在此處設(shè)置PIE
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIE")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fPIE -pie")
# 頭文件目錄
include_directories(
src/main/cpp
)
# 源文件目錄
aux_source_directory(src/main/cpp DIR_SRCS)
# 添加要編譯的可執(zhí)行文件
add_executable(serialControlDaemon ${DIR_SRCS})
其中,add_executable表明要生成的是可執(zhí)行文件,名字為SerialControlDaemon,源文件為DIR_SRCS變量代表的文件,而aux_source_directory將src/main/cpp目錄下的所有文件賦給了變量DIR_SRCS。
1.5修改build.gradle
app/build.gradle文件主要是設(shè)置構(gòu)建app的一些參數(shù),這里主要往android>> defaultConfig>>externalNativeBuild>>cmake添加targets和abiFilters兩個參數(shù)。其中,targets表示生產(chǎn)目標(biāo)文件的名字,與CmakeLists.txt中的相同;abiFilters表示要生產(chǎn)哪種cpu架構(gòu)下的目標(biāo)文件,這里使用armeabi-v7a。修改之后會在右上角提示需要同步項目,點擊即可。
圖6修改build.gradle
1.6編譯cpp項目
在Android Studio中直接使用Build>>Make Project即可編譯整個項目,包括cpp和java。生成的目標(biāo)文件在目錄app/.externalNativeBuild/cmake/debug/armeabi-v7a目錄下,名字為serialControlDaemon。
1.7下載目標(biāo)文件到Android
Android Studio集成了Android開發(fā)的所有工具,在Android Studio中使用adb push命令可以將編譯得到的目標(biāo)文件下載到Android目標(biāo)板上。首先,要使用usb otg的調(diào)試線連接PC和目標(biāo)板;然后點擊左下角的Terminal窗口會彈出所在項目的命令行窗口;輸入命令:
adb push app\.externalNativeBuild\cmake\debug\armeabi-v7a\serialControlDaemo /data/local
這樣,serialControlDaemon便下載到了目標(biāo)板的/data/local目錄下。這時,使用adb shell登陸到Android目標(biāo)板的命令行,修改目標(biāo)文件的運行權(quán)限并運行,整個過程如圖7所示。程序正常運行起來后,表明整個編譯過程沒有問題,用戶可以在命令行中按Ctrl+c停止運行應(yīng)用程序,并輸入exit命令退出adb shell登陸,然后進行下一步的開機自啟動配置。
圖7下載目標(biāo)文件到Android
2、開機自啟動配置
ESM6802上電后通過uboot引導(dǎo)進入linux內(nèi)核,內(nèi)核完成一系列系統(tǒng)配置后會啟動第一個用戶進程:init進程。Android相關(guān)的啟動過程也是從init開始的。在init進程中會掛載Android的文件系統(tǒng),運行init.rc腳本。init進程啟動過后,會fork出子進程去開啟init.rc文件中配置的service。
為了滿足用戶運行不同名字的應(yīng)用程序,英創(chuàng)在init.rc中配置了一個usersh服務(wù)。usersh服務(wù)開機自動運行,具體過程用戶不用關(guān)心。 要想開機自啟動C/C++程序,用戶只需要做兩件事:
●編輯userinfo.txt文件
●復(fù)制userinfo.txt以及C/C++程序的目標(biāo)文件到指定目錄/sdcard/Download
2.1編輯userinfo.txt
Android啟動后,usersh服務(wù)會自動檢測/sdcard/Download/userinfo.txt文件。如果userinfo.txt文件存在,usersh會去解析并啟動userinfo.txt文件中指定的應(yīng)用;如果userinfo.txt不存在,則結(jié)束usersh服務(wù)。userinfo.txt起到一個配置文件的作用,其格式如下:
Name=serialControlDaemon
Param=2
其中,Name指定程序名字,Param指定要帶的參數(shù),沒有可以不寫。用戶可以直接在Android Studio中創(chuàng)建并編輯userinfo.txt文件。
圖8Android Studio中新建userinfo.txt
2.2復(fù)制userinfo.txt以及C/C++程序到指定目錄/sdcard/Download
Android系統(tǒng)中,不是每個目錄都有讀寫以及可執(zhí)行的權(quán)限,這里我們選擇/sdcard/Download作為存儲userinfo.txt和C/C++程序的指定目錄。復(fù)制userinfo.txt以及C/C++程序到指定目錄有兩種方法:通過usb_otg接口使用Android Studio的adb push命令下載到ESM6802,或者通過U盤從PC端拷貝到ESM6802。用戶按其中一種方法下載文件到指定目錄后,重啟ESM6802即可以開機啟動userinfo.txt中指定的C/C++程序。
1、Android Studio命令行下載userinfo.txt和C/C++程序到ESM6802
使用Android Studio命令行下載文件到ESM6802,首先需要使用調(diào)試線連接PC和目標(biāo)板的usb_otg接口。然后,在Android Studio的Terminal窗口輸入:
adb push app\.externalNativeBuild\cmake\debug\armeabi-v7a\serialControlDaemo /sdcard/Download
adb push app\userinfo.txt /sdcard/Download
重啟設(shè)備即可實現(xiàn)開機自啟動serialControlDaemon。
2、U盤拷貝userinfo.txt和C/C++程序到ESM6802
使用U盤拷貝userinfo.txt和C/C++程序到ESM6802,只需要將userinfo.txt和目標(biāo)文件(serialControlDaemon)拷貝到U盤,插到ESM6802的USB接口上,打開Android的文件管理應(yīng)用ES File Explorer,將userinfo.txt和serialControlDaemon拷貝到/sdcard/Download目錄,重新啟動即可。
2.3查看程序是否開機運行
通過以上設(shè)置之后,Android開機boot_completed=1之后會啟動應(yīng)用程序serialControlDaemon,用戶可以通過命令adb shell登陸consolo控制臺,輸入命令getprop | grep init.svc | grep usersh來查看usersh服務(wù)的運行狀態(tài);當(dāng)然usersh實際運行的應(yīng)用程序serialControlDaemon的進程狀態(tài)可以通過ps | grep serialControlDaemon查看。
圖9檢測usersh服務(wù)運行狀態(tài)
3、Q & A
Q1:查看C/C++程序輸出
在Android控制臺上看不到開機啟動的C/C++程序輸出信息,開發(fā)中如何在Android上調(diào)試C/C++程序?
A1:使用kill命令終止掉已經(jīng)啟動的C/C++程序;然后,在Android命令行中執(zhí)行命令:user.sh,即可手動啟動C/C++應(yīng)用程序,并且C/C++應(yīng)用程序的輸出信息將打印到Android控制臺。
Q2:關(guān)于userinfo.txt和C/C++程序指定目錄的說明
A2:userinfo.txt和C/C++程序指定目錄要具有讀寫可執(zhí)行權(quán)限,在2.2節(jié)中,adb push命令將C/C++應(yīng)用程序(serialControlDaemon)下載到了/sdcard/Download目錄,其實下載到/data/local也是可以的,而U盤卻只能拷貝到/sdcard/Download/。這是因為usersh服務(wù)會比較/sdcard/Download/serialControlDaemon是否比/data/local/serialControlDaemon更新,如果是,則先用新文件覆蓋舊文件,再運行/data/local/serialControlDaemon。因此,使用adb push命令的指定目錄用/sdcard/Download/或者/data/local都是可以的;而使用U盤,則受限于ES File Manager應(yīng)用不能訪問/data/local目錄,只能拷貝到/sdcard/Download。
Q3:關(guān)于Android Studio的Terminal窗口
A3:Android Studio的Terminal窗口在進入的時候,工作在PC的文件系統(tǒng)上,操作的文件都是PC上的;當(dāng)使用adb shell登陸Android目標(biāo)板之后,工作在Android目標(biāo)板的文件系統(tǒng)上,操作的文件、執(zhí)行的命令都是Android目標(biāo)板上的;在使用adb shell登陸之后,可以使用exit命令退出登陸狀態(tài),返回到PC端的工作目錄。
Q4:adb連接不上設(shè)備
使用adb devices查看一下是否有已連接的設(shè)備;檢查usb_otg和PC端的物理連接;重新插拔一下調(diào)試線或者重啟系統(tǒng)。
如果ethernet正常工作,可以使用ethernet代替usb_otg,在Terminal中輸入一下命令:
$ adb usb
restarting in USB mode
$ adb devices
List of devices attached
???????????? device
$ adb tcpip 5555
restarting in TCP mode port: 5555
$ adb connect YOUR_IP_ADDRESS
connected to YOUR_IP_ADDRESS:5555
$ adb devices
List of devices attached
???????????? device
YOUR_IP_ADDRESS:5555 device
退出:
adb disconnect YOUR_IP_ADDRESS
Q5:常用命令
查看所有service運行狀態(tài):getprop | grep init.svc
adb相關(guān):
adb devices 查看usb_otg已連接的設(shè)備
adb push localfile remotepath 將PC端的localfile下載到Android端的remotepath目錄下。
adb pull remotefile 復(fù)制Android端的remotefile文件到PC端的當(dāng)前目錄
本文PDF下載:Android雙應(yīng)用進程工控方案(一)——在Android平臺啟動Linux C/C++應(yīng)用程序
-
嵌入式主板
+關(guān)注
關(guān)注
7文章
6100瀏覽量
36299 -
安卓
+關(guān)注
關(guān)注
5文章
2154瀏覽量
58681
發(fā)布評論請先 登錄
使用英特爾? NPU 插件C++運行應(yīng)用程序時出現(xiàn)錯誤:“std::Runtime_error at memory location”怎么解決?
請問是否可以在通用Windows平臺中構(gòu)建OpenVINO? GenAI C++ 應(yīng)用程序?
如何從 Microsoft Visual C++ 應(yīng)用程序 (CyAPI.h) 訪問 CYUSB3014 芯片組的 i2c 接口?
基于OpenHarmony標(biāo)準系統(tǒng)的C++公共基礎(chǔ)類庫案例:ThreadPoll

從Delphi、C++ Builder和Lazarus連接到MySQL數(shù)據(jù)庫

從Delphi、C++ Builder和Lazarus連接到Oracle數(shù)據(jù)庫
Spire.XLS for C++組件說明

android手機上emulate應(yīng)用程序的方法
AWTK-WEB 快速入門(1) - C 語言應(yīng)用程序

TMS320C6000 DMA示例應(yīng)用程序

為I2C啟動加載準備TMS320C645x應(yīng)用程序

使用OpenVINO GenAI API在C++中構(gòu)建AI應(yīng)用程序

C++中實現(xiàn)類似instanceof的方法

評論