diff --git a/src/plugins/android/androidconstants.h b/src/plugins/android/androidconstants.h index 1bc1712e24f..dd3a06fa607 100644 --- a/src/plugins/android/androidconstants.h +++ b/src/plugins/android/androidconstants.h @@ -56,6 +56,7 @@ const char AndroidMkSpecAbis[] = "AndroidMkSpecAbis"; // QStringList const char AndroidSoLibPath[] = "AndroidSoLibPath"; // QStringList const char AndroidTargets[] = "AndroidTargets"; // QStringList const char AndroidApplicationArgs[] = "AndroidApplicationArgs"; // QString +const char AndroidClassPaths[] = "AndroidClassPath"; // QStringList // For qbs support const char AndroidApk[] = "Android.APK"; // QStringList diff --git a/src/plugins/android/javalanguageserver.cpp b/src/plugins/android/javalanguageserver.cpp index d6ea811f00b..db8d0745f62 100644 --- a/src/plugins/android/javalanguageserver.cpp +++ b/src/plugins/android/javalanguageserver.cpp @@ -291,16 +291,29 @@ void JLSClient::updateProjectFiles() return; const FilePath packageSourceDir = FilePath::fromVariant( node->data(Constants::AndroidPackageSourceDir)); - FilePath sourceDir = packageSourceDir.pathAppended("src"); - if (!sourceDir.exists()) - return; + + FilePath sourceDir = packageSourceDir.pathAppended("src/main/java"); + if (!sourceDir.exists()) { + sourceDir = packageSourceDir.pathAppended("src"); + if (!sourceDir.exists()) { + return; + } + } + sourceDir = sourceDir.relativeChildPath(projectDir); + + const QStringList classPaths = node->data(Constants::AndroidClassPaths).toStringList(); + const FilePath &sdkLocation = AndroidConfigurations::currentConfig().sdkLocation(); const QString &targetSDK = AndroidManager::buildTargetSDK(m_currentTarget); const FilePath androidJar = sdkLocation / QString("platforms/%2/android.jar") .arg(targetSDK); FilePaths libs = {androidJar}; libs << packageSourceDir.pathAppended("libs").dirEntries({{"*.jar"}, QDir::Files}); + + for (const QString &path : classPaths) + libs << FilePath::fromString(path); + generateProjectFile(projectDir, qtSrc, project()->displayName()); generateClassPathFile(projectDir, sourceDir, libs); } diff --git a/src/plugins/qbsprojectmanager/qbsnodes.cpp b/src/plugins/qbsprojectmanager/qbsnodes.cpp index 460be9f7d8e..2d034108811 100644 --- a/src/plugins/qbsprojectmanager/qbsnodes.cpp +++ b/src/plugins/qbsprojectmanager/qbsnodes.cpp @@ -219,6 +219,22 @@ QVariant QbsProductNode::data(Id role) const qbsAbis << archToAbi[architecture]; return qbsAbis; } + + if (role == Android::Constants::AndroidPackageSourceDir) { + return m_productData.value("properties").toObject() + .value("sourceDirectory").toString(); + } + + if (role == Android::Constants::AndroidClassPaths) { + QStringList paths; + for (const auto &p : m_productData.value("module-properties").toObject() + .value(Constants::JAVA_ADDITIONAL_CLASSPATHS).toArray()) { + if (p.isString()) + paths << p.toString(); + } + return paths; + } + return {}; } diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanagerconstants.h b/src/plugins/qbsprojectmanager/qbsprojectmanagerconstants.h index 8b35e0f0880..7334cea7381 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanagerconstants.h +++ b/src/plugins/qbsprojectmanager/qbsprojectmanagerconstants.h @@ -68,6 +68,7 @@ const char CPP_PLATFORMLINKERFLAGS[] = "cpp.platformLinkerFlags"; const char CPP_VCVARSALLPATH[] = "cpp.vcvarsallPath"; const char XCODE_DEVELOPERPATH[] = "xcode.developerPath"; const char XCODE_SDK[] = "xcode.sdk"; +const char JAVA_ADDITIONAL_CLASSPATHS[] = "java.additionalClassPaths"; // Settings page const char QBS_SETTINGS_CATEGORY[] = "K.Qbs"; diff --git a/src/plugins/qbsprojectmanager/qbssession.cpp b/src/plugins/qbsprojectmanager/qbssession.cpp index 49d8b31b56f..999e83d2d79 100644 --- a/src/plugins/qbsprojectmanager/qbssession.cpp +++ b/src/plugins/qbsprojectmanager/qbssession.cpp @@ -372,6 +372,7 @@ void QbsSession::insertRequestedModuleProperties(QJsonObject &request) "cpp.useObjcPrecompiledHeader", "cpp.useObjcxxPrecompiledHeader", "cpp.warningLevel", + "java.additionalClassPaths", "qbs.architecture", "qbs.architectures", "qbs.sysroot",