找回密码
 立即注册
  • QQ空间
  • 回复
  • 收藏

QT软件开发-第18章 Ubuntu下QT搭建Android开发环境

admin 2019-12-28 21:21 982人围观 Qt相关



点击上方蓝字关注我们





Linux下QT版本:QT for Android 5.5.1

Ubuntu版本:14.04麒麟版

开发板采用:友善之臂Tiny4412

18.1 安装QT Android版本

18.1.1 下载QT软件


下载地址:

http://download.qt.io/archive/qt/5.5/5.5.1/



图18-1-1 QT下载

18.1.2 安装QT软件


打开命令行终端,切换至超级用户。

xiaolong@xl:/$ sudo su



图18-1-2 切换超级用户

找到下载的QT软件包,./运行软件进行安装。



图18-1-3

安装时出现的qt.network.ssl: QSslSocket: cannot resolve SSLv2_client_method 提示是说明当前环境下缺少OpenSSL库。该库在网络编程的使用需要用到,暂时不影响后面的使用。

OpenSSL库编译步骤:

1、从网络上下载OpenSSL库的源代码。

    地址是:http://openssl.org

2、配置一下OpenSSL,让它产生动态链接库

    ./config enable -shared

3、执行构建

    make

4、将产生的.so文件和它的链接复制到对应的QtSDK/lib文件夹中,具体来说是这几个文件:

libcrypto.so

libcrypto.so.1.0.0

libssl.so

libssl.so.1.0.0



图18-1-4      


图18-1-5



图18-1-6



图18-1-7



图18-1-8



图18-1-9



图18-1-10



图18-1-11

18.1.3 启动软件


QT软件的默认安装路径:/opt/Qt5.5.1/

进入到QtCreator目录:

root@xl:/# cd /opt/Qt5.5.1/Tools/QtCreator/bin/


图18-1-12 QtCreator软件

启动软件:./qtcreator


图18-1-13 启动qtcreator软件

在启动qtcreator的时候出现:No tool chain set from kit "Desktop Qt 5.5.1 GCC 32bit". 提示。这是没有检测到编译器引起的。

解决办法:

安装软件包:# sudo apt-get install build-essential

安装成功后重启qtcreator即可解决。

18.1.4 新建工程测试qtcreator开发环境




图18-1-14 新建工程



图18-1-15 选择桌面应用


图18-1-16 选择工程路径


图18-1-17 选择编译套件


图18-1-18 选择创建的默认类


图18-1-19 完成创建


图18-1-20 进入UI设计界面


图18-1-21 创建标签控件


图18-1-22 运行程序

在构建程序的时候出现如下两个错误。

cannot find -lGL

collect2: error: ld returned 1 exit status


解决办法:

打开命令行终端,切换到超级用户,输入以下命令,安装libgl1软件包。

sudo apt-get install libgl1-mesa-dev

安装成功后,重新构建QT程序。


图18-1-23 运行成功

18.2 搭建QT on Android环境

18.2.1 查看所需要的安装包


工具--->选项-->android选项


图18-2-1 查看依赖的包

18.2.2 安装JDK


JDK官网下载地址:

https://123.sogou.com/?11458


图18-2-2 选择下载选项


图18-2-3 遵守协议


图18-2-4选择对应的版本下载

建一个文件夹存放Android相关的环境配置。

root@xl:/work# mkdir /work/Android_Path -p

将下载的包解压到/work/Android_Path目录下。


#tar xvf jdk-8u91-linux-i586.tar.gz -C /work/Android_Path/

配置QT的JDK路径:


图18-2-5 配置JDK的路径

18.2.3 安装Android SDK


官网下载地址:

 http://dl.google.com/android/adt/adt-bundle-linux-x86-20130729.zip


图18-2-6 下载SDK

将下载的SDK解压到/work/Android_Path 路径下。

#unzip adt-bundle-linux-x86-20130729.zip -C /work/Android_Path/

如果没有unzip命令,输入以下命令进行安装:

#sudo apt-get install zip

 设置QT软件的SDK路径:


图18-2-7 设置SDK的路径

18.2.4 安装Android NDK


官方下载地址:

 http://dl.google.com/Android/ndk/android-ndk-r9-linux-x86.tar.bz2


图18-2-8 下载NDK

将下载的NDK解压到/work/Android_Path 路径下。

# tar xvf android-ndk-r9-linux-x86.tar.bz2 -C /work/Android_Path/

  •  设置QT软件的NDK路径:


图18-2-9 android NDK路径设置

18.2.5 安装ANT


下载地址:

http://ant.apache.org/bindownload.cgi


图 18-2-10 下载ANT

将下载的ANT解压到路径下:/work/Android_Path/

# tar xvf apache-ant-1.9.7-bin.tar.gz -C /work/Android_Path/

 设置QT软件的ANT路径:


图18-2-11 设置Ant路径

18.2.6 创建AVD Android虚拟设备


创建AVD虚拟设备需要使用Android 的SDK工具。

SDK工具路径:/work/Android_Path/adt-bundle-linux-x86-20130729/sdk/tools

 列出当前支持的Android API版本  命令:./android list targets

root@xl:/work/Android_Path/adt-bundle-linux-x86-20130729/sdk/tools# ./android list targets

./android: 1: ./android: java: not found

./android: 1: ./android: java: not found

./android: 110: exec: java: not found

 运行./android list targets出现以上错误。

出现的问题:找不到JDK下的java命令。

解决办法:将JDK解压路径下的bin目录加到系统的环境变量中。

# vim /etc/profile


图18-2-12 添加JDK环境变量

立即生效环境变量:

# source /etc/profil

 列出支持的Android API版本:


图 18-2-13 列出支持Android API的版本

 从列出的信息中看出。支持的API只有一个。ID号为1,API的版本为Android 4.3

创建AVD Android虚拟设备

# ./android create avd -n Android_device -t 1

 Android_device表示AVD Android的名称。

1表示API的ID号。


图18-2-14 创建虚拟设备

按下yes表示创建自定义的设备硬件配置。

默认按下为no,表示选择默认的配置创建。

 列出创建的AVD虚拟设备:

./android list avd



图18-2-15 列出AVD设备

重新启动QT Creator查看创建好的AVD虚拟设备:


图18-2-16 查看AVD虚拟设备

注意:如果QT Creator识别不到AVD设备,需要使用管理员身份到QT Creator安装目录下去运行QT Creator。

修改AVD虚拟设备的一些参数:


图18-2-17 可修改AVD设备的参数

18.2.7 ubuntu 16.04 设置Android环境


Android环境配置如下:


图18-2-18 设置Android环境


图18-2-19 创建安卓虚拟设备效果


图18-2-20 编译QT工程时选择Android编译套件



图18-2-21 选择Android虚拟设备


图18-2-22 Android虚拟设备启动中


图 18-2-23 安卓虚拟设备

先将Tiny4412开发板烧写Android系统,并成功启动系统,再将Tinn4412开发板使用miniUSB与电脑相连接,挂载设备挂载到Ubuntu16.04系统。


图 18-2-24


图18-2-25 挂载开发板到ubuntu系统


图18-2-26 输入lsusb命令可以查看到识别的设备


图18-2-27 识别到开发板设备


图18-2-28 进入设备的shell终端


图18-2-29 输入exit命令可退出Shell终端

    当开发板挂进ubuntu系统之后,编译QT时就可以选择开发板作为调试设备,安装程序测试。

注意: 想让QT软件支持自动安装APK文件、识别到Android设备,需要将Android设备的开发者选项里的USB调试打开。


图18-2-30 选择开发板作为Android部署设备


图18-2-31 Android开发板运行效果


图18-2-32 打开USB调试

18.3 ADB命令工具操作Android设备

18.3.1 新建Android应用程序工程



图 18-3-1 新建工程


图18-3-2 选择项目路径名称


图18-3-3 选择Android 套件

多个编译套件都可以一起选择。


图18-3-4 进入到UI设计界面


图18-3-5


图18-3-6 执行程序(快捷键:CTRL+R)


图18-3-7 选择程序部署的设备


图18-3-8 启动AVD 虚拟设备过程(需要一段时间启动)


图18-3-9 启动成功

18.3.2使用 adb 命令连接实体android 设备


adb命令用法:

1. 使用 lsudb 查看是否识别到 android 设备

2. adb devices 查看已经识别到的设备(需要将 sdk 解压目录下的 adb 命令加入到系统环境变量中)

3. adb shell 进入 android 设备 shell 终端

退出Android设备的shell终端:exit

su 切换为超级用户:

使用ADB命令需要将adb命令路径加到系统环境变量PATH中。

adb命令的路径:

/work/Android_Path/adt-bundle-linux-x86-20130729/sdk/platform-tools/adb

# vim /etc/profile



图18-3-10 设置adb命令的环境变量

立即生效环境变量:source /etc/profile

将Tiny4412开发板通过数据线连接到电脑的USB口上,打开虚拟机点击右下角的照相机图标,将4412开发板挂载到linux系统中。


图18-3-11 挂载Android设备

查看挂载的USB设备


图18-3-12

使用adb查看识别到的Android设备


图18-3-13

使用adb进入Android设备终端shell命令行


图18-3-14

如果有多个Android设备,可以选择进入指定的Android设备Shell终端

语法:adb -s Android设备名称 shell


图 18-3-15

-s 选项表示指定设备。adb的其他命令都可加-s参数来区分不同的设备。

18.3.3 adb 命令检测不到设备解决办法


在终端输入以下 3 条命令:

adb kill-server

adb start-server

adb remount

再使用 adb devices 和 adb shell 就可以使用 android adb 功能了。

18.3.4 Android设备Shell终端无法文件目录解决


默认Android的根文件系统为只读文件系统,无法修改创建文件或目录。


图18-3-16 创建目录失败的提示

解决办法:重新挂载文件系统为可读写

mount -o remount ,rw /


图18-3-17 创建目录

如果发现某些系统配置文件无法修改解决办法:挂载系统分区权限为可读写

mount -o remount /dev/block/mmcblk0p2 /system

 修改文件的权限为777。

示例:chmod  777  /etc/init.tiny4412.sh

以上的方法只针对当前有效,如果重启开发板后又会恢复为读取文件系统。

要实现永久修改,需要修改Android源码。

Tiny4412 Android源码中的文件系统权限挂载配置文件:

device/friendly-arm/tiny4412/conf/fstab.tiny4412

将fstab.tiny4412文件以下内容:

/dev/block/mmcblk0p2  /system   ext4     ro                 wait

改为

/dev/block/mmcblk0p2  /system   ext4     rw                wait

修改源码后,重新生成system.img烧写Android系统即可生效。


图18-3-18 修改Android源码

如果不想修改源码,可将以上两条命令放入开机自动执行的脚本文件中。

Tiny4412开发板Android系统上电自动执行的初始化脚本文件:/etc/init.tiny4412.sh

在 /etc/init.tiny4412.sh 脚本文件中加入以下两行挂载命令:


图18-3-19 修改初始化脚本,加入挂载命令

修改之后,每次开发板上电都会执行脚本中的内容,实现上电自动挂载文件系统为可读写!

18.3.5 adb命令传输文件到Android设备


使用ADB命令可以将PC机的文件通过USB数据线上传至Android设备。

语法:adb push PC机的文件 Android设备存放目录

示例:


图18-3-20 传输文件到Android设备

注意:执行传输文件的命令时,需要退出Android设备的Shell命令行。(exit)

18.3.6 配置Android设备IP地址


在Android设备里可以使用netcfg命令来查看IP地址的信息。

进入Android设备Shell命令行:adb shell

查看网卡信息:netcfg


图18-3-21 查看IP信息

Netcfg用法:

root@tiny4412:/ # netcfg -help                                                

usage: netcfg [<interface> {dhcp|up|down}]

 动态获取IP:netcfg eth0 dhcp

关闭网卡:netcfg eth0 down

18.4 Android 下原生Linux驱动测试

18.4.1 Android设备运行C语言程序


C语言源代码:

 1 #include <stdio.h>

 2 int main(int argc,char ** argv)

 3 {

 4     printf("hello world!\n");

 5     return 0;

 6 }

 编译C语言源码:编译的时候加上-static静态选项


root@xl:/test# arm-linux-gcc -static hello.c -o hello

 传输编译好的文件到Android设备:

root@xl:/# adb push /test/hello /

896 KB/s (607564 bytes in 0.661s)

 运行测试:


图18-4-1

18.4.2 Linux内核编译


Tiny4412开发板的Android系统版本为:Android5.0.2

对应的Linux内核版本:linux-3.0.86-20150929.tgz

Linux内核源码的位置:光盘A盘\Android5.0.2\linux-3.0.86-20150929.tgz

编译好的Android映像文件位置:光盘B盘\images\Android

将linux内核源码拷贝至linxu系统解压、配置、编译:

root@xl:/work/linux-src# tar xvf linux-3.0.86-20150929.tgz

root@xl:/work/linux-src/linux-3.0.86# cp tiny4412_android_defconfig .config

root@xl:/work/linux-src/linux-3.0.86# make -j16

编译成功后会在arch/arm/boot 目录下生成 zImage,将它替换掉 SD 卡 images/Android/下的 zImage烧写到Tiny4412 即可。

18.4.3 Android源码下载


Tiny4412开发板Android源码下载地址:http://112.124.9.243/4412-additional-download.php


图 18-4-2 下载好的Android源码

18.4.4 编写蜂鸣器驱动


驱动代码:

#include <linux/kernel.h>

#include <linux/module.h>

#include <linux/miscdevice.h>  //杂项设备

#include <linux/fs.h>          //文件操作

#include <linux/uaccess.h>   

#include <linux/io.h>

volatile unsigned int *GPD0CON;  //配置寄存器

volatile unsigned int *GPD0DAT; //数据寄存器

static int tiny4412_open(struct inode *my_inode, struct file *my_file)

{

printk("open函数调用成功!\n");

//初始化,配置寄存器

*GPD0CON&=~(0xf<<0*4);

*GPD0CON|=(0x1<<0*4);

return 0;

}

static int tiny4412_release(struct inode *my_inode, struct file *my_file)

{

printk("release 函数调用成功\n");

*GPD0DAT&=~(1<<0);  //关

return 0;

}

static ssize_t tiny4412_read (struct file *my_file, char __user *buf, size_t count, loff_t *loff)

{

printk("read 函数调用成功\n");

*GPD0DAT|=1<<0;  //开

return count;

}

static ssize_t tiny4412_write(struct file *my_file, const char __user *buf, size_t count, loff_t *loff)

{

printk("write 函数调用成功\n");

*GPD0DAT&=~(1<<0);  //关

return count;

}

//虚拟文件操作集合

static struct file_operations tiny4412_ops=

{

.open=tiny4412_open,

.release=tiny4412_release,

.write=tiny4412_write,

.read=tiny4412_read

};

//定义杂项设备核心结构体

static struct miscdevice tiny4412_misc=

{

.minor=255,  //255表示系统自动分配次设备号

.name="tiny4412_beep_test",   //设备的名称. /dev生成的节点。

.fops=&tiny4412_ops    //虚拟文件操作集合

};

static int __init tiny4412_led_module_init(void)

{

   //杂项设备注册函数

    misc_register(&tiny4412_misc);

//映射物理地址

 GPD0CON=ioremap(0x114000A0,4);

 GPD0DAT=ioremap(0x114000A4,4);

    printk("Hello, Tiny4412 module is installed !\n");

    return 0;

}

static void __exit tiny4412_led_module_cleanup(void)

{

//杂项设备卸载函数

    misc_deregister(&tiny4412_misc);

/*取消映射*/

iounmap(GPD0CON);

iounmap(GPD0DAT);

  printk("Good-bye, Tiny4412 module was removed!\n");

}

module_init(tiny4412_led_module_init);

module_exit(tiny4412_led_module_cleanup);

MODULE_LICENSE("GPL");


app代码:

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <stdlib.h>

int main(int argc,char **argv)

{

int fb;

if(argc!=2)

{

 printf("格式:./app /dev/tiny4412_xx");

 exit(-1);

}

fb=open(argv[1],2);

if(fb<0)

{

printf("设备打开失败!\n");

exit(-1);

}

 int dat;

 while(1)

 {

 read(fb,&dat,1);

 sleep(1);

 write(fb,&dat,1);

 sleep(1);

 }

close(fb);

return 0;

}


Makefile:

ADDR=/work/linux-src/linux-3.0.86

obj-m +=led_drives.o

all:

@make -C $(ADDR) M=`pwd` modules

@arm-linux-gcc -static led_app.c-o app

clean:

@make -C $(ADDR) M=`pwd` modules clean

 如果/dev/下的设备节点打开失败,需要修改设备节点的权限。

例如:chmod  777  /dev/tiny4412_beep_test

将文件上传至Android设备:


图 18-4-3 adb

安装驱动运行测试

root@tiny4412:/ # insmod led_drives.ko                                        

root@tiny4412:/ # ./app /dev/tiny4412_beep_test    

运行APP之后,开发板的蜂鸣器就会开始循环的滴滴响了。

18.4.5 编写Android应用程序控制蜂鸣器代码


注意:需要提前安装好蜂鸣器的设备驱动,并修改dev下蜂鸣器的设备节点权限777。

因为Android程序默认的运行权限为普通用户。

UI界面:


图18-4-4 界面设计

主要代码:

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include <sys/types.h>

#include <sys/stat.h>

 #include <fcntl.h>

int fb;

MainWindow::MainWindow(QWidget *parent) :

    QMainWindow(parent),

    ui(new Ui::MainWindow)

{

    ui->setupUi(this);

    fb=open("/dev/tiny4412_beep_test",2);

    if(fb<0)

    {

         ui->label_flag->setText("设备文件打开失败");

    }

    else

    {

        ui->label_flag->setText("设备文件打开成功");

    }

}

MainWindow::~MainWindow()

{

    delete ui;

}

void MainWindow::on_pushButton_clicked()

{

      int dat;

     write(fb,&dat,1);//关

}

void MainWindow::on_pushButton_open_clicked()

{

    int dat;

    read(fb,&dat,1);//开

}



部署到Tiny4412开发板:



图18-4-5 部署到Tiny4412开发板

注意: 想让QT软件支持自动安装APK文件、识别到Android设备,需要将Android设备的开发者选项里的USB调试打开。

在Tiny4412开发板运行效果:


图18-4-6 运行效果



 图18-4-7

18.5 设置Android程序的图标和签名文件

18.5 创建Android签名文件


在项目页面,查看编译安卓APK详情页。


图18-5-1 点击详情


图18-5-2 创建签名文件

18.6 创建AndroidManifest.xml文件


在项目页面,点击 “Create Templates” 按钮,创建Android模板文件。


图18-6-1 创建Android模板文件



图18-6-2 创建的Android相关配置文件

18.7 设置Android应用的版本信息和图标


上一步创建了Android模板文件之后,在QT的工程目录下会创建一个Android目录,生成的Android相关配置文件也会自动加入到QT工程中;打开AndroidManifest.xml文件可以设置当前Android应用程序的图标、版本、应用程序名称相关的信息。

为了方便加载图标,在android/res目录下,分别创建3个目录,用于存放不同尺寸的图标:

[wbyq@wbyq res]$pwd

/home/wbyq/project/ImageTransfer_ubuntu/android/re

[wbyq@wbyq res]$mkdir drawable-hdpi

[wbyq@wbyq res]$mkdir drawable-ldpi

[wbyq@wbyq res]$mkdir drawable-mdpi

然后将3张尺寸不同的图片存放到这个3个目录下,当做Android应用程序的应用图标。


图18-7-1 创建存放图标的目录

图标文件完成之后,将“Qt Creator”软件关闭重新打开,再打开AndroidManifest.xml文件会看到自动加载的图标,然后在设置当前应用程序的版本信息、程序名称、包名等等。

注: 图标也可以在打开AndroidManifest.xml文件之后,直接点击下面3个框框选择。


图18-7-2 配置页面

18.8 测试效果



图 18-8-1 选择开发板部署Android程序

应用程序安装之后,可以看到正确显示的图标。


图18-8-2 显示的应用程序图标


图18-8-3 显示的版本号


图18-8-4 打开软件运行效果

在build-ImageTransfer-Android_for_armeabi_v7a_GCC_4_8_Qt_5_6_0-Release/android-build/bin 目录下可以看到生成的xxx.apk文件。


图18-8-5 APK文件存放位置


技术合作与咨询

QQ:1126626497
关注我长按二维码可识别微信号:xl1126626497



----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:DS小龙哥 嵌入式技术资讯,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

yafeilinux和他的朋友们微信公众号二维码

微信公众号

专注于Qt嵌入式Linux开发等。扫一扫立即关注。

Qt开源社区官方QQ群二维码

QQ交流群

欢迎加入QQ群大家庭,一起讨论学习!

我有话说......