C++学习(一七六)Qt for Android环境搭建
Posted hankern
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++学习(一七六)Qt for Android环境搭建相关的知识,希望对你有一定的参考价值。
https://www.cnblogs.com/MakeView660/p/11206268.html
https://zhuanlan.zhihu.com/p/72911170
QT5.12.0+
android-ndk-r19c-windows-x86_64.zip+
jdk-8u281-windows-x64.exe+
installer_r24.4.1-windows.exe(安装API28 buidtools 28.0.2)+
模拟选用arm的,虽然是Android7下的,但是Android9也可以用
上面开发的是Android9应用,也能运行在Android10系统上
和Qt5.12适配的版本,Qt官方也没有说,都是自己试出来的。
QT5.12只能进行Android 9以下开发,具体查看以下文件,强行修改这里的版本号QT不认。
D:\\Qt\\Qt5.12.0\\5.12.0\\android_arm64_v8a\\src\\android\\templates\\AndroidManifest.xml
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="28"/>
QT5.12默认的Gradle版本是4.6,该版本不兼容JDK15,
1、JDK安装
这是android代码的编译、调试环境。
下载安装jdk-15.0.1_windows-x64_bin.zip https://www.oracle.com/java/technologies/javase-jdk15-downloads.html
配置环境变量
JAVA_HOME-D:\\jdk-15.0.1
CLASSPATH-.;%JAVA_HOME%\\lib;%JAVA_HOME%\\lib\\tools.jar
在Path变量名中添加变量值:%JAVA_HOME%\\bin
测试:
2、Android SDK安装
这是Android的开发库,它的各种功能都在这个库中。
通过Android SDK Manager android-sdk_r24.4.1-windows.zip(http://tools.android-studio.org/index.php/sdk/)安装(如果这个工具不是最新的会自动更新),安装完毕后,找到SDK安装目录下面的“platform-tools”目录,把此目录的路径“..\\platform-tools”添加到系统环境变量Path中。
3、Andoid NDK安装
NDK,Native Development Kit,允许用户使用类似C / C++之类的原生代码语言执行部分程序。NDK包括以下方面:
1、从C / C++生成原生代码库所需要的工具和build files。
2、将一致的原生库嵌入可以在Android设备上部署的应用程序包文件(application packages files ,即.apk文件)中。
3、支持所有未来Android平台的一系列原生系统头文件和库。
ndk包的形式如: android-ndk-r<version>-<os-type>-<arch>.zip
下载最新的包(https://developer.android.google.cn/ndk/downloads/),解压下载好的ndk,将其与sdk置于同一级目录下即可。
Qt5.12能用的NDK是R19C,当前最新的是R20,里面工具链有修改,Qt还没有跟上,得后续版本(Qt5.12.5)。
4、Qt安装
http://download.qt.io/archive/qt/5.12/5.12.0/
5、Qt的Android工程创建
更换ndk版本则不会出现上述错误,qt5.12与ndk的r22不兼容(应该是没有做过测试,qt5.12发布时间要早于r22)
修改环境变量ANDROID_NDK_PLATFORM,这样可以定位到android10
构建时会提示:ld: cannot find -lc++
按C++学习(一八八)android程序编译时NDK ld: cannot find -lc++,添加如下指令即可
QMAKE_LINK += -nostdlib++
打APK包时提示
Unzipping C:\\Users\\admin\\.gradle\\wrapper\\dists\\gradle-4.6-bin\\4jp4stjndanmxuerzfseyb6wo\\gradle-4.6-bin.zip to C:\\Users\\admin\\.gradle\\wrapper\\dists\\gradle-4.6-bin\\4jp4stjndanmxuerzfseyb6wo
FAILURE: Build failed with an exception.
* What went wrong:
Could not determine java version from '15.0.1'.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
Warning: QML import could not be resolved in any of the import paths: QtQuick.Controls.impl
Warning: QML import could not be resolved in any of the import paths: QtQuick.Controls.Fusion.impl
Warning: QML import could not be resolved in any of the import paths: QtQuick.Controls.Imagine.impl
Warning: QML import could not be resolved in any of the import paths: QtQuick.Controls.Material.impl
Warning: QML import could not be resolved in any of the import paths: QtQuick.Controls.Universal.impl
Building the android package failed!
-- For more information, run this command with --verbose.
06:18:20: 进程"D:\\Qt\\Qt5.12.0\\5.12.0\\android_arm64_v8a\\bin\\androiddeployqt.exe"退出,退出代码 14 。
Error while building/deploying project testAndroidQML (kit: Android for arm64-v8a (Clang Qt 5.12.0 for Android ARM64-v8a))
When executing step "Build Android APK"
问题核心原因是 Grade 和 JDK 的版本不兼容,因此有两个解决方法:
升级 Gradle
Gradle 官网 下载了最新版本 4.10.2,可以解决这个问题。
降级 JDK
ORACLE 官网 下载 JDK 1.8.0 ,也可以解决这个问题。
QT5.12默认使用gradle4.6
D:\\Qt\\Qt5.12.0\\5.12.0\\android_arm64_v8a\\src\\3rdparty\\gradle\\gradle\\wrapper
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\\://services.gradle.org/distributions/gradle-4.6-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
修改为
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\\://services.gradle.org/distributions/gradle-6.8-bin.zip
#distributionUrl=https\\://services.gradle.org/distributions/gradle-4.6-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
在构建工程时会建立gradle-6.8-bin.zip的下载目录“C:\\Users\\admin\\.gradle\\wrapper\\dists\\gradle-6.8-bin\\1jblhjyydfkclfzx1agp92nyl”,可以单独下载此文件(https://services.gradle.org/distributions/),放在该目录下
继续,出现如下错误 A problem occurred configuring root project 'android-build'
Unzipping C:\\Users\\admin\\.gradle\\wrapper\\dists\\gradle-6.8-bin\\1jblhjyydfkclfzx1agp92nyl\\gradle-6.8-bin.zip to C:\\Users\\admin\\.gradle\\wrapper\\dists\\gradle-6.8-bin\\1jblhjyydfkclfzx1agp92nyl
Welcome to Gradle 6.8!
Here are the highlights of this release:
- Faster Kotlin DSL script compilation
- Vendor selection for Java toolchains
- Convenient execution of tasks in composite builds
- Consistent dependency resolution
For more details see https://docs.gradle.org/6.8/release-notes.html
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.codehaus.groovy.reflection.CachedClass (file:/C:/Users/admin/.gradle/wrapper/dists/gradle-6.8-bin/1jblhjyydfkclfzx1agp92nyl/gradle-6.8/lib/groovy-all-1.3-2.5.12.jar) to method java.lang.Object.finalize()
WARNING: Please consider reporting this to the maintainers of org.codehaus.groovy.reflection.CachedClass
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
FAILURE: Build failed with an exception.
* What went wrong:
A problem occurred configuring root project 'android-build'.
> Failed to notify project evaluation listener.
> 'org.gradle.api.file.RegularFileProperty org.gradle.api.file.ProjectLayout.fileProperty(org.gradle.api.provider.Provider)'
打开sdk manage。分别下载Extras中android support repository、Google play services、google repository这三个sdk的包。
问题依然存在,应该和下面有关
D:\\Qt\\Qt5.12.0\\5.12.0\\android_arm64_v8a\\src\\android\\templates\\build.gradle
buildscript
dependencies //dependencies 闭包,指定当前项目的所有依赖关系,本地依赖、库依赖以及远程依赖;
classpath 'com.android.tools.build:gradle:3.2.0'//声明gradle插件,插件版本号为3.2.0
尝试下载28版本的build tools
创建模板Create Templates,发现QT5.12最多支持到API 28 Android 9,强行修改AndroidManifest.xml将API设为29没有效果(会自动删除该设置,应该是QT5.12内部进行过滤了)。
再次下载API 28进行尝试
要注意点击Create Templates,这样会在工程中创建一个gradle配置的模板(将gradle安装目录下的相关文件复制一份到工程中),可以进行灵活配置,以适应工程项目特点,而不需要到gradle的安装目录下进行修改。
项目可能生成apk文件失败,有可能是buildtool的版本不对,修改build.gradle文件中的版本号即可。
compileSdkVersion androidCompileSdkVersion.toInteger()
//buildToolsVersion androidBuildToolsVersion
buildToolsVersion '28.0.0'
以上是关于C++学习(一七六)Qt for Android环境搭建的主要内容,如果未能解决你的问题,请参考以下文章
C++学习(二七六)Android Studio下的资源类别drawable layout等
C++学习(四一七)AndroidStudio中的libs和jniLibs