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

C++学习(三七六)Strawberry perl

C++学习(三三七)Qt5.12+osgEarth2.9 for Android

C++学习(三一七)ASCII码表

Qt For Android 开发环境配置