qtqbs与android

qtqbs与android,android,qt,qbs,Android,Qt,Qbs,我试图找到一个简单的教程:如何使用gbps为android创建一个简单的应用程序。已找到以下链接: . 这个问题的答案还没有确定 收到,尽管cbs的版本已经更新 到1.11,并包括对android的支持。 . 在这种情况下,我得到警告:“../Application/src/main/AndroidManifest.xml”不存在。 很遗憾,我找不到任何新信息。我请求帮助 更新: 对于Qmake,我只创建如下标准小部件项目: QT += core gui greaterThan(Q

我试图找到一个简单的教程:如何使用gbps为android创建一个简单的应用程序。已找到以下链接:

. 这个问题的答案还没有确定 收到,尽管cbs的版本已经更新 到1.11,并包括对android的支持。 . 在这种情况下,我得到警告:“../Application/src/main/AndroidManifest.xml”不存在。 很遗憾,我找不到任何新信息。我请求帮助

更新: 对于Qmake,我只创建如下标准小部件项目:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = androidtest
TEMPLATE = app

DEFINES += QT_DEPRECATED_WARNINGS

SOURCES += \
        main.cpp \
        mainwindow.cpp

HEADERS += \
        mainwindow.h

FORMS += \
        mainwindow.ui

CONFIG += mobility
MOBILITY = 
这是工作和建设良好。QtCreator会自动创建所有必要的文件,然后在我的手机上运行应用程序

在Qbs中,我尝试使用相同的应用程序。因此,我有QBS文件:

import qbs

Project {
    CppApplication {
        name: "helloworld"

        Depends {
            name: "Qt"
            submodules: [
                "core",
                "widgets"
            ]
        }

        Depends { name: "Android.ndk" }
        Android.ndk.appStl: "gnustl_shared"

        Group {
            name: "src"
            files: [
                "main*.*"

            ]
        }
    }

    AndroidApk {
        name: "helloworld_android"
        Depends {name: "helloworld" }
        packageName: "com.example.android.helloworld"
    }
}

最后,我完成了HelloWorld产品libhelloworld.so。但helloworld_android的第一个错误是android清单失败。此文件未定义。接下来我应该做什么?

qmake在为Android构建时具有一些内置的魔力,比如使用Qt提供的资源(包括清单模板)和运行Android deployqt工具。所有这些目前都不是qbs做的。

好的,我想我做到了。这不是一个好的解决方案,但这是一项工作。您可以在\install root\$productName$\build\outputs\APK\$productName$-debug.APK中找到生成的APK

import qbs
import qbs.TextFile
import qbs.Process
import qbs.File

Project {
    //Main Application
    CppApplication {
        name: "helloworld";

        Depends {
            name: "Qt"
            submodules: [
                "core",
                "widgets"
            ]
        }

        Depends { name: "Android.ndk" }
        Android.ndk.appStl: "gnustl_shared"

        Group {
            name: "src"
            files: [
                "main*.*"
            ]
        }
        Group {
            qbs.install: true
            fileTagsFilter: "dynamiclibrary"
            qbs.installPrefix : product.name+"/libs/"+Android.ndk.abi+"/"
        }
    }

    //Preparation
    Product {
        name: "Prepared2Deploy"
        type: "prepared2deploy"
        Depends { name: "helloworld" }
        Depends { name: "Qt.core" }
        Depends { name: "Android.ndk" }
        Depends { name: "Android.sdk" }
        Rule {
            inputsFromDependencies: "installable"
            Artifact {
                filePath: input.fileName+".json"
                fileTags: "prepared2deploy"
            }
            prepare: {
                var cmd = new JavaScriptCommand();
                cmd.description = "prepare for androidDeployQt";
                cmd.highlight = "install";
                cmd.sourceCode = function() {
                    var outputFile = new TextFile(output.filePath, TextFile.WriteOnly);
                    outputFile.writeLine("{");
                    outputFile.writeLine("     \"qt\": \"" + product.Qt.core.binPath.replace(/\/bin$/,"") + "\",");
                    outputFile.writeLine("     \"sdk\": \"" + product.Android.sdk.sdkDir + "\",");
                    outputFile.writeLine("     \"sdkBuildToolsRevision\": \"" + product.Android.sdk.buildToolsVersion + "\",");
                    var ndkDir = product.Android.ndk.ndkDir.replace(/\\/g,"/"); //why sdk ndk get wrong slashes?
                    outputFile.writeLine("     \"ndk\": \""+ndkDir+"\",");
                    var toolchain =  product.cpp.toolchainPrefix.replace(/-$/,"");
                    outputFile.writeLine("     \"toolchain-prefix\": \"" + toolchain + "\",");
                    outputFile.writeLine("     \"tool-prefix\": \"" + toolchain + "\",");
                    outputFile.writeLine("     \"toolchain-version\": \"4.9\",");   //how I can get it ???
                    outputFile.writeLine("     \"ndk-host\": \"windows-x86_64\","); //how I can get it ???
                    var abi = product.Android.ndk.abi
                    outputFile.writeLine("     \"target-architecture\": \""+abi+"\",");
                    outputFile.writeLine("     \"stdcpp-path\": \""+ndkDir+"/sources/cxx-stl/gnu-libstdc++/4.9/libs/" + //how I can get it ???
                                         abi+"/lib"+product.Android.ndk.appStl+".so\",");
                    outputFile.writeLine("     \"application-binary\": \""+ input.filePath+"\"");
                    outputFile.writeLine("}");
                    outputFile.close();
                }
                return cmd;
            }
        }
    }
    //Deployer
    Product {
        name: "AndroidDeployQt"
        Depends { name: "helloworld" }
        id: androidDeployQt
        type: "androidDeployQt"
        Depends {name: "Qt.core" }

        Rule {
            inputsFromDependencies: "prepared2deploy"
            alwaysRun: true
            Artifact {
                filePath: "log.txt"
                fileTags: "androidDeployQt"
            }
            prepare: {
                var cmd = new JavaScriptCommand();
                cmd.description = "androidDeployQt";
                cmd.highlight = "install";
                cmd.sourceCode = function() {
                    var logFile = new TextFile(output.filePath, TextFile.WriteOnly);
                    logFile.writeLine(input.fileName);
                    var productName = input.fileName.replace(/.so.json$/,"").replace(/^(lib)/,"");
                    var androidDeployProcess = new Process();
                    var exitCode = androidDeployProcess.exec(product.Qt.core.binPath+"/androiddeployqt.exe",
                                                             [
                                                                 "--input", input.filePath,
                                                                 "--output", project.buildDirectory+"/install-root/"+productName,
                                                                 "--android-platform", "android-25", //???
                                                                 "--gradle"
                                                             ])
                    if (exitCode) {
                        console.error("Error at androidDeployProcess. Error code: "+exitCode);
                        console.error(androidDeployProcess.readStdErr());
                        console.error("FULL_LOG: ");
                        console.error(androidDeployProcess.readStdOut());
                    }
                    logFile.close();
                }
                return cmd;
            }
        }
    }
}

2019年2月发布的QBS 1.13使得部署Android应用程序与使用qmake一样简单。实际上,你不需要做任何特别的事情。例如,我使用并添加了这个QBS文件:

import qbs 1.0

Project {
    QtGuiApplication {
        name: "contactlist"
        install: true

        files: [
            "contactmodel.h",
            "contactmodel.cpp",
            "main.cpp",
        ]

        Group {
            files: [
                "*.qml",
                "designer/Backend/*.qml",
                "designer/Backend/qmldir",
            ]
            fileTags: ["qt.core.resource_data"]
        }

        Depends { name: "Qt.quick" }
    }
}
正如你所看到的,这里没有任何特定于Android的东西。我使用的唯一技巧是将标记qt.core.resource_数据分配给QML文件,以便将它们编译为资源文件,但这甚至不是必需的


使用qbs run,应用程序将在连接的Android设备上运行。

您应该将项目文件粘贴到此处,或者链接到项目(如果该项目在internet上可用),这样我们就可以确切地知道您试图做什么。Christian,目前我做了很多错事。我刚刚开始使用QBS和android。我想得到任何Hello world的例子,以便以后在工作中使用。我知道你属于这个QBS项目的开发组,我想得到一个简单的例子,我可以用QBS为android构建。我祈祷与大家分享。qbs端的Hello World项目真的没什么大不了的:您使用普通的Android项目结构Java源、资产、资源、清单文件等,并将qbs项目指向它。例如,这是Android SDK中一个示例项目的qbs项目文件:。然后用你用安卓安装工具设置的配置文件来构建它。请参阅问题的更新。这是一个非常糟糕的答案。好的,我想我需要自制一些模块来准备android apk和Qbs以及androiddeployqt.exe。在这种情况下,Qbs中需要什么AndroidPK项目