diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp index 1467facc2eb..1991f63681d 100644 --- a/src/plugins/android/androidsettingswidget.cpp +++ b/src/plugins/android/androidsettingswidget.cpp @@ -55,6 +55,7 @@ #include #include #include +#include #include #include #include @@ -101,6 +102,7 @@ private: void apply() final { AndroidConfigurations::setConfig(m_androidConfig); } void validateJdk(); + Utils::FilePath findJdkInCommonPaths(); void validateNdk(); void onSdkPathChanged(); void validateSdk(); @@ -353,7 +355,11 @@ AndroidSettingsWidget::AndroidSettingsWidget() m_ui->NDKLocationPathChooser->setFileName(m_androidConfig.ndkLocation()); m_ui->NDKLocationPathChooser->setPromptDialogTitle(tr("Select Android NDK folder")); - m_ui->OpenJDKLocationPathChooser->setFileName(m_androidConfig.openJDKLocation()); + Utils::FilePath currentJdkPath = m_androidConfig.openJDKLocation(); + if (currentJdkPath.isEmpty()) + currentJdkPath = findJdkInCommonPaths(); + + m_ui->OpenJDKLocationPathChooser->setFileName(currentJdkPath); m_ui->OpenJDKLocationPathChooser->setPromptDialogTitle(tr("Select JDK Path")); m_ui->DataPartitionSizeSpinBox->setValue(m_androidConfig.partitionSize()); m_ui->CreateKitCheckBox->setChecked(m_androidConfig.automaticKitCreation()); @@ -466,6 +472,53 @@ void AndroidSettingsWidget::validateJdk() updateUI(); } +Utils::FilePath AndroidSettingsWidget::findJdkInCommonPaths() +{ + QString jdkFromEnvVar = QString::fromLocal8Bit(getenv("JAVA_HOME")); + if (!jdkFromEnvVar.isEmpty()) + return Utils::FilePath::fromString(jdkFromEnvVar); + + if (Utils::HostOsInfo::isWindowsHost()) { + QString jdkRegisteryPath = "HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\JDK\\"; + QSettings jdkSettings(jdkRegisteryPath, QSettings::NativeFormat); + + QStringList jdkVersions = jdkSettings.childGroups(); + Utils::FilePath jdkHome; + + for (const QString &version : jdkVersions) { + jdkSettings.beginGroup(version); + jdkHome = Utils::FilePath::fromString(jdkSettings.value("JavaHome").toString()); + jdkSettings.endGroup(); + if (version.startsWith("1.8")) + return jdkHome; + } + + return jdkHome; + } + + QProcess findJdkPathProc; + + QString cmd; + QStringList args; + + if (Utils::HostOsInfo::isMacHost()) { + cmd = "sh"; + args << "-c" << "/usr/libexec/java_home"; + } else { + cmd = "sh"; + args << "-c" << "readlink -f $(which java)"; + } + + findJdkPathProc.start(cmd, args); + findJdkPathProc.waitForFinished(); + QByteArray jdkPath = findJdkPathProc.readAllStandardOutput().trimmed(); + + if (Utils::HostOsInfo::isMacHost()) + return Utils::FilePath::fromUtf8(jdkPath); + else + return Utils::FilePath::fromUtf8(jdkPath.replace("jre/bin/java", "")); +} + void AndroidSettingsWidget::validateNdk() { auto ndkPath = Utils::FilePath::fromUserInput(m_ui->NDKLocationPathChooser->rawPath());