参考文档:
https://blog.csdn.net/qq_28643619/article/details/86589252 用这个教程里面对于NDK的版本没有仔细说明,只说了10是不行的,用了9.但我现在官方已经找不到9这个版本了。导致我第一次搞不知道因为这里的NDK版本和Qt版本没有一致,一直出不来QV Version。搞了我两天时间。
https://blog.csdn.net/corner_kew/article/details/82881784 这个里面的Qt是5.11和我的一样,用的NDK版本是我打算模仿的。希望可以成功。结果果然成功了,这个由于Qt版本和NDK版本不一致导致的问题搞了我整整两天时间。卧槽。。。。。。
背景介绍
B1 qmake
qmake -project (用于创建.pro文件,将所有的cpp文件编译成一个与平台无关的pro工程文件)
qmake(将所有的cpp文件编译成两个文件):
一个makefile文件,用于linux下用make调用gcc/g++编译成Linux下的可执行程序;
一个pro文件,同上。
开发环境搭建步骤:
1 JDK Java SE Development kit(JDK) java开发工具包
JDK全称Java SE Development kit(JDK),即java标准版开发包,是Oracle提供的一套用于开发java应用程序的开发包,它提供编译,运行java程序所需要的各种工具和资源,包括java编译器,java运行时环境,以及常用的java类库等。
JRE Java Runtime Environment(JRE) Java运行环境
Java运行环境,它的全称Java Runtime Environment(JRE) ,因此也被称为JRE,它是运行java的必需条件。
JVM Java Virtual Machine
Java虚拟机,JRE包含JVM。JVM是运行java程序的核心虚拟机,还需要其他的类加载器,字节码校验器,以及大量的基础类库。JRM除了包含JVM之外,还包含运行java程序的其它环境支持。安装配置环境变量成功的标志是在cmd命令行输入 java 和 javac 都有输出
Java JDK JRE下载与环境变量配置,详细参考菜鸟教程
JAVA_HOME :C:\Program Files\Java\jdk1.8.0_144
CLASSPATH: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
注意上面CLASSPATH变量第一个字符是点.
Path:添加
%JAVA_HOME%\bin
%JAVA_HOME%\jre\bin
安装成功的标志:
java -version
javac -version
android sdk (Android Software Development Kit, 即android软件开发工具包)可以说只要你使用java去开发Android这个东西就必须用到。他包含了SDK Manager 和 AVD Manage,对于android系统的一些开发版本的管理以及模拟器管理。它只能运行纯java程序,有了它模拟器才可以使用。
而ndk (Native Development Kit)跟sdk差不多的是它也是一个开发工具包。用它开发c/c++是很方便的。他有一个强大的编译集合。Java调C、C++(jni接口),是一些java如何调C的代码。它会把C代码编译成一个.SO的动态库,通过jni接口用java代码去调用它,有了它我们可以直接在android代码中去添加C代码。
2 andriod sdk
开发安卓专属的开发工具包。也是Java的语言,但是Java访问的是一个安装手机系统的屏幕,配置文件,内存,等等。
安装andriod sdk有两种方式:andriod studio,或者单独的installer.exe
start Andriod sdk manager
该下载安装的都替你勾选了,点击install 17 packages
选择accept,install
时间有点久,耐心等待。
配置环境变量:参考https://www.cnblogs.com/gufengchen/p/11038029.html
首先,新建一个系统环境变量,变量名为ANDROID_SDK_HOME,变量值为你的SDK安装路径,这里我的安装路径为D:\android\android-sdk,如图所示:
然后就是在系统的Path变量后,追加:
%ANDROID_SDK_HOME%\platform-tools
%ANDROID_SDK_HOME%\tools
如图所示:
验证的方法就是命令行输入adb有输出:
3 Andriod_NDK
NDK必须和对应的QT版本保持兼容。确定,我用的最新的NDK20无法和QT的5.11.2兼容!!!!!
就是下面的这个问题搞了我两天整的时间:
can not create kits for all architectures
qt versions are missing for the following architectures:arm-linux-android-elf-64bit, x86-linux-android-elf-64bit
其实这个问题并不是问题,不碍事,不用关心
重新下载了NDK版本r12b之后,表面看没什么变化,其实QT VERSION已经正常了
但是我想要的东西出来了,Android GCC编译器出来了
构建套件里有Andriod for 就说明QT可以开发安卓程序了
4 生成APK
Qt Creator 》文件》新建文件或项目》Application》选一个支持Andriod平台的就行
选择项目名称和路径
选择编译的目标平台
编译的时候需要Qt Creator用管理员权限编译。不然报错:
Could not initialize analytics, treating as opt-out.
java.io.FileNotFoundException: C:\Program Files (x86)\Android\android-sdk\analytics.settings (鎷掔粷璁块棶銆
选择编译版本
点击“锤子”构建项目
第一次生成会很慢,因为要下载Gradle.
生成完了之后拷贝到手机上安装说CPU版本不对
原因是没有签名https://blog.csdn.net/qq_37603131/article/details/89515730
加了签名重新构建安装打开
5 Android项目中的armeabi,armeabi-v7a和x86
这三者都表示的是CPU类型,早期的Android系统几乎只支持ARMv5的CPU架构,但是现在已经有7种了。ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起),每一种都关联着一个相应的ABI(应用程序二进制接口(ApplicationBinary Interface)定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库)。Android现在的主流CPU是armeabi-v7a。armeabi-v7a是针对有浮点运算或高级扩展功能的ARMv7 CPU。 参考:https://www.jianshu.com/p/ed9c3fea3584
例如:Android for armeabi-v7a (GCC 4.9, Qt 5.11.2 for Android ARMv7) ,可以看出来,这个是从C++代码到机器指令的一个工具。因为GCC Qt都是C++的编译器。
5.1 Android设备如何加载.so文件
当一个应用安装在设备上,只有该设备支持的CPU架构对应的.so文件会被安装。不同CPU架构的Android手机加载时会在libs下找自己对应的目录(生成apk文件的时候会把各个cup架构下的so文件一起打包走),从对应的目录下寻找需要的.so文件;如果没有对应的目录,就会去armeabi下去寻找,如果已经有对应的目录,但是如果没有找到对应的.so文件,也不会去armeabi下去寻找了。
以x86设备为例,x86设备会在项目中的 libs文件夹寻找是否含有x86文件夹,如果含有x86文件夹,则默认为该项目有x86对应的so可运行文件,只有x86文件夹而文件夹下没有so,程序运行也是会出现findlibrary returned null的错误的;如果工程本身不含有x86文件夹,则会寻找armeabi或者armeabi-v7a文件夹,兼容运行。以armeabi-v7a设备为例,该Android设备当然优先寻找libs目录下的armeabi-v7a文件夹,同样,如果只有armeabi-v7a文件夹而没有 so也是会报错的;如果找不到armeabi-v7a文件夹,则寻找armeabi文件夹,兼容运行该文件夹下的so,但是不能兼容运行x86的so。所以项目中如果只含有x86的so,在armeabi和armeabi-v7a也是无法运行的。以上就是不同CPU架构运行时加载so的策略。
5.3 适配不同的平台
目前主流的Android设备是armeabi-v7a架构的,然后就是x86和armeabi了。如果同时包含了 armeabi,armeabi-v7a和x86,所有设备都可以运行,程序在运行的时候去加载不同平台对应的so,这是较为完美的一种解决方案,但是同时也会导致包变大。
armeabi-v7a是可以兼容armeabi的,而v7a的CPU支持硬件浮点运算,目前绝大对数设备已经是armeabi-v7a了,所以为了性能上的更优,就不要为了兼容放到armeabi下了。x86也是可以兼容armeabi平台运行的,另外需要指出的是,打出包的x86的so,总会比armeabi平台的体积更小,对于性能有洁癖的童鞋们,还是建议在打包so的时候支持x86。
6 模拟器调试
报错:cannot create a AVD for ABI armeabi-v7a
- 当搭建qt 安卓环境时候出现AVD报错时,需要安装android studio 并且打开AVD,就OK
- 用jdk8
安装 android-studio-bundle-162.4069837-windows.exe
参考:https://blog.csdn.net/hanjuefu5827/article/details/98345358
QT 与 VS
这里说一下QT与VS的关系
1 QT Creator和VS都是IDE,但是VS只能开发运行在Windows上的程序;QT可以开发出能运行在各个平台的程序。
2 QT的工程用pro文件,是跨平台的,VS的 vcxproj工程是只能编译Windows上运行的exe
3 Qt同时也是一个类库。或者说同时还是一个界面库。如果你用VS C++开发Windows应用程序,想使用Qt的界面库和其他类,引用进来需要一个Qt Visual Studio Tools工具。