那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

英創信息技術Android平臺啟動Linux C/C++應用程序

英創信息技術 ? 來源:英創信息技術 ? 作者:英創信息技術 ? 2020-02-06 11:25 ? 次閱讀

Android是移動設備的主流操作系統,近年來越來越多的工業領域的客戶開始關注基于Android操作系統的設備在工控領域的應用。鑒于Android是基于Linux內核的事實,我們發展了一種以雙應用進程為特色的Android工控應用方案,并在ESM6802工控主板上加以實現。具體說來,就是在Linux平臺上運行一個直接操作硬件接口的控制通訊管理進程,為保證運行效率,該進程采用C/C++語言編寫(以下簡稱C進程或控制進程);另一方面在Android平臺采用標準Java語言編寫一個人機界面進程(以下簡稱Java進程)。底層的控制進程并不依賴與上層的Java進程而獨立運行,兩個進程之間通過本地IP進行通訊,控制進程處于服務器偵聽模式,Java進程則為客戶端模式。本方案的主要優點是客戶可以直接繼承已有的現成應用程序作為底層控制進程的基礎,僅僅增加標準的Socket偵聽功能,即可快速完成新的底層應用程序的設計。而界面的Java程序,由于不再涉及具體的工控硬件接口,屬于單純的Android程序,編程難度也大大降低。

我們將通過多篇技術報告來具體介紹雙進程方案在ESM6802主板上實現的相關技術。本文是《Android雙應用進程工控方案》的第一篇,主要介紹在Android環境中,如何編譯C/C++應用程序,下載并配置為開機啟動程序。

本文PDF下載:Android雙應用進程工控方案(一)——在Android平臺啟動Linux C/C++應用程序

1、重新編譯C/C++應用程序

如圖1所示,由于傳統的Linux程序依賴的是glibc庫,而Android程序需要的是谷歌公司在AOSP(Android Open Source Project)中提供的Bionic庫(比glibc小,提供了Android特定的函數)。所以,原來Linux上的C/C++程序要運行在Android系統上,必須要在Android的編譯環境中重新編譯。英創推薦使用Android官方開發工具Android Studio,下載CMake和NDK工具,進行C/C++程序的重新編譯。

圖1Android和Linux依賴庫區別

下面開始介紹使用Android Studio的NDK編譯工具重新編譯C/C++程序的過程。

1.1搭建Android Studio NDK編譯環境

Android Studio的安裝具體過程請參考文檔《Android Studio 應用開發簡介》的第一章,在SDK Tools頁面中一定要勾選NDK和CMake。

1.2在Android Studio中新建C++項目

圖2新建C++項目

首先新建一個Android Studio項目,并勾選Include C++ support選項,此處的Application name是Android app的名字,與最終需要的C++程序無關,用戶可隨意設定。然后一直點擊下一步“Next”,直到圖3頁面,使用默認的工具鏈,點擊Finish。

圖3默認工具鏈

點擊finish后會進入項目編輯頁面,進入到圖4所示的項目視圖,可以看到所有的目錄結構,其中app/src/main/cpp目錄、app/build.gradle和app/CMakeLists.txt是用戶需要編輯修改的。然后,點擊左上角File >> Project Structure進入圖5的頁面,檢查NDK環境路徑是否正確設置。

圖4項目目錄結構及要修改的文件

圖5環境路徑設置檢查

1.3復制C/C++應用程序源碼

將原C/C++應用程序的所有源文件拷貝到app/src/main/cpp目錄。

1.4修改CMakeLists.txt

新的Android Studio已經支持使用cmake編譯c++項目,這里提供對于簡單項目使用的CMakeLists.txt,對于更復雜的需求,用戶可以參考cmake官網文檔https://cmake.org/cmake/help/v3.4/自行修改。

app/CMakeLists.txt:

cmake_minimum_required(VERSION 3.4.1)

# Android 5.0 以上需要在此處設置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)

# 添加要編譯的可執行文件

add_executable(serialControlDaemon ${DIR_SRCS})

其中,add_executable表明要生成的是可執行文件,名字為SerialControlDaemon,源文件為DIR_SRCS變量代表的文件,而aux_source_directory將src/main/cpp目錄下的所有文件賦給了變量DIR_SRCS。

1.5修改build.gradle

app/build.gradle文件主要是設置構建app的一些參數,這里主要往android>> defaultConfig>>externalNativeBuild>>cmake添加targets和abiFilters兩個參數。其中,targets表示生產目標文件的名字,與CmakeLists.txt中的相同;abiFilters表示要生產哪種cpu架構下的目標文件,這里使用armeabi-v7a。修改之后會在右上角提示需要同步項目,點擊即可。

圖6修改build.gradle

1.6編譯cpp項目

在Android Studio中直接使用Build>>Make Project即可編譯整個項目,包括cpp和java。生成的目標文件在目錄app/.externalNativeBuild/cmake/debug/armeabi-v7a目錄下,名字為serialControlDaemon。

1.7下載目標文件到Android

Android Studio集成了Android開發的所有工具,在Android Studio中使用adb push命令可以將編譯得到的目標文件下載到Android目標板上。首先,要使用usb otg的調試線連接PC和目標板;然后點擊左下角的Terminal窗口會彈出所在項目的命令行窗口;輸入命令:

adb push app\.externalNativeBuild\cmake\debug\armeabi-v7a\serialControlDaemo /data/local

這樣,serialControlDaemon便下載到了目標板的/data/local目錄下。這時,使用adb shell登陸到Android目標板的命令行,修改目標文件的運行權限并運行,整個過程如圖7所示。程序正常運行起來后,表明整個編譯過程沒有問題,用戶可以在命令行中按Ctrl+c停止運行應用程序,并輸入exit命令退出adb shell登陸,然后進行下一步的開機自啟動配置。

圖7下載目標文件到Android

2、開機自啟動配置

ESM6802上電后通過uboot引導進入linux內核,內核完成一系列系統配置后會啟動第一個用戶進程:init進程。Android相關的啟動過程也是從init開始的。在init進程中會掛載Android的文件系統,運行init.rc腳本。init進程啟動過后,會fork出子進程去開啟init.rc文件中配置的service。

為了滿足用戶運行不同名字的應用程序,英創在init.rc中配置了一個usersh服務。usersh服務開機自動運行,具體過程用戶不用關心。 要想開機自啟動C/C++程序,用戶只需要做兩件事:

●編輯userinfo.txt文件

●復制userinfo.txt以及C/C++程序的目標文件到指定目錄/sdcard/Download

2.1編輯userinfo.txt

Android啟動后,usersh服務會自動檢測/sdcard/Download/userinfo.txt文件。如果userinfo.txt文件存在,usersh會去解析并啟動userinfo.txt文件中指定的應用;如果userinfo.txt不存在,則結束usersh服務。userinfo.txt起到一個配置文件的作用,其格式如下:

Name=serialControlDaemon

Param=2

其中,Name指定程序名字,Param指定要帶的參數,沒有可以不寫。用戶可以直接在Android Studio中創建并編輯userinfo.txt文件。

圖8Android Studio中新建userinfo.txt

2.2復制userinfo.txt以及C/C++程序到指定目錄/sdcard/Download

Android系統中,不是每個目錄都有讀寫以及可執行的權限,這里我們選擇/sdcard/Download作為存儲userinfo.txt和C/C++程序的指定目錄。復制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,首先需要使用調試線連接PC和目標板的usb_otg接口。然后,在Android Studio的Terminal窗口輸入:

adb push app\.externalNativeBuild\cmake\debug\armeabi-v7a\serialControlDaemo /sdcard/Download

adb push app\userinfo.txt /sdcard/Download

重啟設備即可實現開機自啟動serialControlDaemon。

2、U盤拷貝userinfo.txt和C/C++程序到ESM6802

使用U盤拷貝userinfo.txt和C/C++程序到ESM6802,只需要將userinfo.txt和目標文件(serialControlDaemon)拷貝到U盤,插到ESM6802的USB接口上,打開Android的文件管理應用ES File Explorer,將userinfo.txt和serialControlDaemon拷貝到/sdcard/Download目錄,重新啟動即可。

2.3查看程序是否開機運行

通過以上設置之后,Android開機boot_completed=1之后會啟動應用程序serialControlDaemon,用戶可以通過命令adb shell登陸consolo控制臺,輸入命令getprop | grep init.svc | grep usersh來查看usersh服務的運行狀態;當然usersh實際運行的應用程序serialControlDaemon的進程狀態可以通過ps | grep serialControlDaemon查看。

圖9檢測usersh服務運行狀態

3、Q & A

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

在Android控制臺上看不到開機啟動的C/C++程序輸出信息,開發中如何在Android上調試C/C++程序?

A1:使用kill命令終止掉已經啟動的C/C++程序;然后,在Android命令行中執行命令:user.sh,即可手動啟動C/C++應用程序,并且C/C++應用程序的輸出信息將打印到Android控制臺。

Q2:關于userinfo.txt和C/C++程序指定目錄的說明

A2:userinfo.txt和C/C++程序指定目錄要具有讀寫可執行權限,在2.2節中,adb push命令將C/C++應用程序(serialControlDaemon)下載到了/sdcard/Download目錄,其實下載到/data/local也是可以的,而U盤卻只能拷貝到/sdcard/Download/。這是因為usersh服務會比較/sdcard/Download/serialControlDaemon是否比/data/local/serialControlDaemon更新,如果是,則先用新文件覆蓋舊文件,再運行/data/local/serialControlDaemon。因此,使用adb push命令的指定目錄用/sdcard/Download/或者/data/local都是可以的;而使用U盤,則受限于ES File Manager應用不能訪問/data/local目錄,只能拷貝到/sdcard/Download。

Q3:關于Android Studio的Terminal窗口

A3:Android Studio的Terminal窗口在進入的時候,工作在PC的文件系統上,操作的文件都是PC上的;當使用adb shell登陸Android目標板之后,工作在Android目標板的文件系統上,操作的文件、執行的命令都是Android目標板上的;在使用adb shell登陸之后,可以使用exit命令退出登陸狀態,返回到PC端的工作目錄。

Q4:adb連接不上設備

使用adb devices查看一下是否有已連接的設備;檢查usb_otg和PC端的物理連接;重新插拔一下調試線或者重啟系統。

如果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運行狀態:getprop | grep init.svc

adb相關:

adb devices 查看usb_otg已連接的設備

adb push localfile remotepath 將PC端的localfile下載到Android端的remotepath目錄下。

adb pull remotefile 復制Android端的remotefile文件到PC端的當前目錄

本文PDF下載:Android雙應用進程工控方案(一)——在Android平臺啟動Linux C/C++應用程序

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式主板
    +關注

    關注

    7

    文章

    6086

    瀏覽量

    35616
  • 安卓
    +關注

    關注

    5

    文章

    2136

    瀏覽量

    57604
收藏 人收藏

    評論

    相關推薦

    從Delphi、C++ Builder和Lazarus連接到MySQL數據庫

    平臺。 基于 MyDAC 的應用程序可以直接連接到 MySQL 服務器或通過 MySQL 客戶端庫工作。MySQL 數據訪問組件旨在幫助程序員更快、更輕松地開發 MySQL 數據庫應用程序
    的頭像 發表于 01-20 13:47 ?121次閱讀
    從Delphi、<b class='flag-5'>C++</b> Builder和Lazarus連接到MySQL數據庫

    從Delphi、C++ Builder和Lazarus連接到Oracle數據庫

    C++ Builder(包括社區版),以及 Windows、Linux、macOS、iOS 和 Android 上的 Lazarus/Pascal,到 Oracle 的本機連接。ODAC 庫旨在
    的頭像 發表于 01-15 10:01 ?139次閱讀

    Spire.XLS for C++組件說明

    Spire.XLS for C++ 是一款專業的 C++ Excel 組件,可以用在各種 C++ 框架和應用程序中。Spire.XLS for C+
    的頭像 發表于 01-14 09:40 ?148次閱讀
    Spire.XLS for <b class='flag-5'>C++</b>組件說明

    android手機上emulate應用程序的方法

    Android手機上模擬(emulate)應用程序的方法通常涉及到使用Android模擬器(Emulator)或類似的工具來模擬Android環境,以便在沒有實際物理設備的情況下運行
    的頭像 發表于 12-05 15:33 ?479次閱讀

    AWTK-WEB 快速入門(1) - C 語言應用程序

    導讀AWTK可以使用相同的技術棧開發各種平臺應用程序。有時我們需要使用Web界面與設備進行交互,本文介紹一下如何使用C語言開發AWTK-WEB應用
    的頭像 發表于 11-27 11:46 ?294次閱讀
    AWTK-WEB 快速入門(1) - <b class='flag-5'>C</b> 語言<b class='flag-5'>應用程序</b>

    C語言和C++中結構體的區別

    同樣是結構體,看看在C語言和C++中有什么區別?
    的頭像 發表于 10-30 15:11 ?356次閱讀

    中科達榮獲2024年軟件和信息技術服務優秀企業

    及前百家企業”名單。中科達憑借非凡的技術實力與持續的創新能力,成功入選“2024年度軟件和信息技術服務競爭力百強企業”以及“2024年軟件和信息技術服務優秀企業”。
    的頭像 發表于 10-30 11:44 ?557次閱讀

    C7000優化C/C++編譯器

    電子發燒友網站提供《C7000優化C/C++編譯器.pdf》資料免費下載
    發表于 10-30 09:45 ?0次下載
    <b class='flag-5'>C</b>7000優化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器

    TMS320C6000 DMA示例應用程序

    電子發燒友網站提供《TMS320C6000 DMA示例應用程序.pdf》資料免費下載
    發表于 10-26 10:17 ?0次下載
    TMS320<b class='flag-5'>C</b>6000 DMA示例<b class='flag-5'>應用程序</b>

    為I2C啟動加載準備TMS320C645x應用程序

    電子發燒友網站提供《為I2C啟動加載準備TMS320C645x應用程序.pdf》資料免費下載
    發表于 10-16 11:30 ?0次下載
    為I2<b class='flag-5'>C</b><b class='flag-5'>啟動</b>加載準備TMS320<b class='flag-5'>C</b>645x<b class='flag-5'>應用程序</b>

    使用OpenVINO GenAI API在C++中構建AI應用程序

    許多桌面應用程序是使用 C++ 開發的,而將生成式AI(GenAI)功能集成到這些應用程序中可能會很具有挑戰性,尤其是因為使用像 Hugging Face 這樣的 Python 庫的復雜性。C
    的頭像 發表于 10-12 09:36 ?469次閱讀
    使用OpenVINO GenAI API在<b class='flag-5'>C++</b>中構建AI<b class='flag-5'>應用程序</b>

    C++中實現類似instanceof的方法

    并執行特定于類型的操作。無論是在編譯時檢查類型,還是在運行時動態標識對象類型,C++ 都提供了強大的機制來獲取類型信息
    的頭像 發表于 07-18 10:16 ?673次閱讀
    <b class='flag-5'>C++</b>中實現類似instanceof的方法

    SEGGER編譯器優化和安全技術介紹 支持最新CC++語言

    SEGGER編譯器是專門為ARM和RISC-V微控制器設計的優化C/C++編譯器。它建立在強大的Clang前端上,支持最新的CC++語言功能。 除其他外,其主要功能包括: 1)?尺寸
    的頭像 發表于 06-04 15:31 ?1528次閱讀
    SEGGER編譯器優化和安全<b class='flag-5'>技術</b>介紹 支持最新<b class='flag-5'>C</b>和<b class='flag-5'>C++</b>語言

    在嵌入式系統中集成Rust和Qt的實踐

    Rust 擁有豐富的庫生態系統,用于序列化和反序列化、異步操作、解析不安全輸入、線程、靜態分析等,而 Qt 是一個 C++ 工具包,支持跨各種平臺的豐富的、基于 GUI 的應用程序,從 iOS 到嵌入式
    發表于 05-03 10:26 ?1889次閱讀
    在嵌入式系統中集成Rust和Qt的實踐

    鴻蒙OS開發實例:【Native C++

    使用DevEco Studio創建一個Native C++應用。應用采用Native C++模板,實現使用NAPI調用C標準庫的功能。使用C標準庫hypot接口計算兩個給定數平方和的平
    的頭像 發表于 04-14 11:43 ?2765次閱讀
    鴻蒙OS開發實例:【Native <b class='flag-5'>C++</b>】
    视频百家乐官网破解| 百家乐官网高手论坮| 百家乐官网太阳城怎么样| 玩百家乐技巧巧| 百家乐官网官方游戏| 大发888账号注册| 太阳城百家乐下载网址| 百家乐官网终端下载| 全讯网xb112| 百家乐娱乐城博彩| 送彩金百家乐官网的玩法技巧和规则 | 24山72局消砂| 金赞百家乐官网现金网| 大发888老虎机下载免费| 网上百家乐有没有假| 高科技百家乐官网牌具| 华安县| 棋牌游戏平台开发| 九州百家乐的玩法技巧和规则| 三合四局24向黄泉| 百家乐官网白菜价| 驻马店市| 决胜德州扑克刷金币| 威尼斯人娱乐城 线路畅通中心| 百家乐暗红色桌布| 缅甸百家乐网站| 百家乐官网作| 赌百家乐官网庄闲能赢| 娱乐城百家乐官网打不开| 广德县| 大田县| 大发888游戏平台 46| 百家乐网上玩法| 可以玩百家乐的博彩网站| 百家乐有看牌器吗| 百家乐官网园百乐彩| 土豪百家乐官网的玩法技巧和规则 | 电子百家乐作假| 百家乐旺门打| 百家乐规则| 老虎机技巧|