forked from qt-creator/qt-creator
Android: Look for latest JDK version and not 1.8 specifically
Recent SDK Manager that is used by Qt Creator works with JDK 11+, and JDK 11 is needed by Qt 5.15.7+, so look for the newest JDK instead of 1.8 as currently being done. Change-Id: I6ff415aa300d742735e8636b24a03116d5bfe2b6 Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
@@ -108,9 +108,6 @@ const char macOsKey[] = "mac";
|
||||
|
||||
|
||||
namespace {
|
||||
const char jdk8SettingsPath[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit";
|
||||
const char jdkLatestSettingsPath[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\JDK\\";
|
||||
|
||||
const QLatin1String SettingsGroup("AndroidConfigurations");
|
||||
const QLatin1String SDKLocationKey("SDKLocation");
|
||||
const QLatin1String CustomNdkLocationsKey("CustomNdkLocations");
|
||||
@@ -1482,7 +1479,7 @@ Environment AndroidConfigurations::toolsEnvironment(const AndroidConfig &config)
|
||||
Environment env = Environment::systemEnvironment();
|
||||
FilePath jdkLocation = config.openJDKLocation();
|
||||
if (!jdkLocation.isEmpty()) {
|
||||
env.set("JAVA_HOME", jdkLocation.toUserOutput());
|
||||
env.set(Constants::JAVA_HOME_ENV_VAR, jdkLocation.toUserOutput());
|
||||
env.prependOrSetPath(jdkLocation.pathAppended("bin"));
|
||||
}
|
||||
return env;
|
||||
@@ -1539,51 +1536,40 @@ static FilePath androidStudioPath()
|
||||
|
||||
FilePath AndroidConfig::getJdkPath()
|
||||
{
|
||||
FilePath jdkHome;
|
||||
FilePath jdkHome = FilePath::fromString(qEnvironmentVariable(Constants::JAVA_HOME_ENV_VAR));
|
||||
if (jdkHome.exists())
|
||||
return jdkHome;
|
||||
|
||||
if (HostOsInfo::isWindowsHost()) {
|
||||
QStringList allVersions;
|
||||
std::unique_ptr<QSettings> settings(
|
||||
new QSettings(jdk8SettingsPath, QSettings::NativeFormat));
|
||||
allVersions = settings->childGroups();
|
||||
#ifdef Q_OS_WIN
|
||||
if (allVersions.isEmpty()) {
|
||||
settings.reset(new QSettings(jdk8SettingsPath, QSettings::Registry64Format));
|
||||
allVersions = settings->childGroups();
|
||||
// Look for Android Studio's jdk first
|
||||
const FilePath androidStudioSdkPath = androidStudioPath();
|
||||
if (!androidStudioSdkPath.isEmpty()) {
|
||||
const FilePath androidStudioSdkJrePath = androidStudioSdkPath / "jre";
|
||||
if (androidStudioSdkJrePath.exists())
|
||||
jdkHome = androidStudioSdkJrePath;
|
||||
}
|
||||
#endif // Q_OS_WIN
|
||||
|
||||
// If no jdk 1.8 can be found, look for jdk versions above 1.8
|
||||
// Android section would warn if sdkmanager cannot run with newer jdk versions
|
||||
if (allVersions.isEmpty()) {
|
||||
settings.reset(new QSettings(jdkLatestSettingsPath, QSettings::NativeFormat));
|
||||
allVersions = settings->childGroups();
|
||||
if (jdkHome.isEmpty()) {
|
||||
QStringList allVersions;
|
||||
QSettings settings("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\JDK\\",
|
||||
QSettings::NativeFormat);
|
||||
allVersions = settings.childGroups();
|
||||
#ifdef Q_OS_WIN
|
||||
if (allVersions.isEmpty()) {
|
||||
settings.reset(new QSettings(jdkLatestSettingsPath, QSettings::Registry64Format));
|
||||
allVersions = settings->childGroups();
|
||||
settings.setDefaultFormat(QSettings::Registry64Format);
|
||||
allVersions = settings.childGroups();
|
||||
}
|
||||
#endif // Q_OS_WIN
|
||||
}
|
||||
|
||||
for (const QString &version : qAsConst(allVersions)) {
|
||||
settings->beginGroup(version);
|
||||
jdkHome = FilePath::fromUserInput(settings->value("JavaHome").toString());
|
||||
settings->endGroup();
|
||||
if (version.startsWith("1.8")) {
|
||||
if (!jdkHome.exists())
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Nothing found yet? Let's try finding Android Studio's jdk
|
||||
if (jdkHome.isEmpty()) {
|
||||
const FilePath androidStudioSdkPath = androidStudioPath();
|
||||
if (!androidStudioSdkPath.isEmpty()) {
|
||||
const FilePath androidStudioSdkJrePath = androidStudioSdkPath / "jre";
|
||||
if (androidStudioSdkJrePath.exists())
|
||||
jdkHome = androidStudioSdkJrePath;
|
||||
// Look for the highest existing JDK
|
||||
allVersions.sort();
|
||||
std::reverse(allVersions.begin(), allVersions.end()); // Order descending
|
||||
for (const QString &version : qAsConst(allVersions)) {
|
||||
settings.beginGroup(version);
|
||||
jdkHome = FilePath::fromUserInput(settings.value("JavaHome").toString());
|
||||
settings.endGroup();
|
||||
if (jdkHome.exists())
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@@ -72,6 +72,7 @@ const char ANDROID_ABIS[] = "ANDROID_ABIS";
|
||||
const char ANDROID_APPLICATION_ARGUMENTS[] = "ANDROID_APPLICATION_ARGUMENTS";
|
||||
const char ANDROID_DEPLOYMENT_SETTINGS_FILE[] = "ANDROID_DEPLOYMENT_SETTINGS_FILE";
|
||||
const char ANDROID_SO_LIBS_PATHS[] = "ANDROID_SO_LIBS_PATHS";
|
||||
const char JAVA_HOME_ENV_VAR[] = "JAVA_HOME";
|
||||
|
||||
const char ANDROID_PACKAGE_INSTALL_STEP_ID[] = "Qt4ProjectManager.AndroidPackageInstallationStep";
|
||||
const char ANDROID_BUILD_APK_ID[] = "QmakeProjectManager.AndroidBuildApkStep";
|
||||
|
@@ -301,9 +301,8 @@ AndroidSettingsWidget::AndroidSettingsWidget()
|
||||
tr("Android SDK path exists and is writable.");
|
||||
androidValidationPoints[JavaPathExistsAndWritableRow] = tr("JDK path exists and is writable.");
|
||||
androidValidationPoints[SdkToolsInstalledRow] = tr("SDK tools installed.");
|
||||
androidValidationPoints[SdkManagerSuccessfulRow] = tr("SDK manager runs.");
|
||||
androidValidationPoints[PlatformToolsInstalledRow] = tr("Platform tools installed.");
|
||||
androidValidationPoints[SdkManagerSuccessfulRow] = tr(
|
||||
"SDK manager runs (SDK Tools versions <= 26.x require exactly Java 1.8).");
|
||||
androidValidationPoints[AllEssentialsInstalledRow] = tr(
|
||||
"All essential packages installed for all installed Qt versions.");
|
||||
androidValidationPoints[BuildToolsInstalledRow] = tr("Build tools installed.");
|
||||
|
@@ -120,7 +120,7 @@ void AndroidToolChain::addToEnvironment(Environment &env) const
|
||||
env.set(QLatin1String("ANDROID_NDK_HOST"), config.toolchainHostFromNdk(m_ndkLocation));
|
||||
const Utils::FilePath javaHome = config.openJDKLocation();
|
||||
if (javaHome.exists()) {
|
||||
env.set(QLatin1String("JAVA_HOME"), javaHome.toUserOutput());
|
||||
env.set(Constants::JAVA_HOME_ENV_VAR, javaHome.toUserOutput());
|
||||
const FilePath javaBin = javaHome.pathAppended("bin");
|
||||
const FilePath currentJavaFilePath = env.searchInPath("java");
|
||||
if (!currentJavaFilePath.isChildOf(javaBin))
|
||||
|
Reference in New Issue
Block a user