Android: detect JDK path automatically

Try to detect the install JDK path automatically.

Task-number: QTCREATORBUG-23407
Change-Id: Ie23aec9260d54f58b0284ed4a26b17b03d8ed87c
Reviewed-by: BogDan Vatra <bogdan@kdab.com>
This commit is contained in:
Assam Boudjelthia
2020-01-13 15:18:35 +02:00
parent a4f837dbbd
commit 0a8588829f

View File

@@ -55,6 +55,7 @@
#include <QList> #include <QList>
#include <QMessageBox> #include <QMessageBox>
#include <QModelIndex> #include <QModelIndex>
#include <QSettings>
#include <QString> #include <QString>
#include <QTimer> #include <QTimer>
#include <QUrl> #include <QUrl>
@@ -101,6 +102,7 @@ private:
void apply() final { AndroidConfigurations::setConfig(m_androidConfig); } void apply() final { AndroidConfigurations::setConfig(m_androidConfig); }
void validateJdk(); void validateJdk();
Utils::FilePath findJdkInCommonPaths();
void validateNdk(); void validateNdk();
void onSdkPathChanged(); void onSdkPathChanged();
void validateSdk(); void validateSdk();
@@ -353,7 +355,11 @@ AndroidSettingsWidget::AndroidSettingsWidget()
m_ui->NDKLocationPathChooser->setFileName(m_androidConfig.ndkLocation()); m_ui->NDKLocationPathChooser->setFileName(m_androidConfig.ndkLocation());
m_ui->NDKLocationPathChooser->setPromptDialogTitle(tr("Select Android NDK folder")); 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->OpenJDKLocationPathChooser->setPromptDialogTitle(tr("Select JDK Path"));
m_ui->DataPartitionSizeSpinBox->setValue(m_androidConfig.partitionSize()); m_ui->DataPartitionSizeSpinBox->setValue(m_androidConfig.partitionSize());
m_ui->CreateKitCheckBox->setChecked(m_androidConfig.automaticKitCreation()); m_ui->CreateKitCheckBox->setChecked(m_androidConfig.automaticKitCreation());
@@ -466,6 +472,53 @@ void AndroidSettingsWidget::validateJdk()
updateUI(); 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() void AndroidSettingsWidget::validateNdk()
{ {
auto ndkPath = Utils::FilePath::fromUserInput(m_ui->NDKLocationPathChooser->rawPath()); auto ndkPath = Utils::FilePath::fromUserInput(m_ui->NDKLocationPathChooser->rawPath());