Qt für Android – Sprachaustausch
Veranschaulicht den Aufruf von Java- und Kotlin-Code aus Qt sowie von Qt-Code aus Java und Kotlin in einer Android-Anwendung.

Klicken Sie auf eine der Schaltflächen, um eine Zeichenkette an die Java- und Kotlin-Klassen zu senden und eine modifizierte Zeichenkette zurückzubekommen.

Dieses Beispiel zeigt, wie man eine benutzerdefinierte Java-Klasse und eine benutzerdefinierte Kotlin-Klasse zu einer Android-Anwendung hinzufügt und wie man diese mithilfe der JNI-Komfort-APIs in Qt aufruft. Umgekehrt rufen die Java- und Kotlin-Klassen Qt-Funktionen auf.
Ausführen des Beispiels
Sie können das Beispiel wie folgt ausführen:
- Qt Creator
Öffnen Sie den Modus „ Welcome “ und wählen Sie das Beispiel unter „ Examples “ aus. Weitere Informationen finden Sie unter Qt Creator: Tutorial: Erstellen und Ausführen.
- Qt Extension for Visual Studio Code
Führen Sie den Befehl „ Qt: Open Qt examples “ über die „ Command Palette “ aus und wählen Sie das Beispiel aus der Liste aus. Weitere Informationen finden Sie unter Qt Extension for Visual Studio Code: Tutorial: Erstellen und Ausführen.
Hinweis: Dieses Beispiel kann nur auf Android-Geräten ausgeführt werden.
Datenaustausch zwischen C++ und Java/Kotlin mithilfe von Qt-Signalen
Wir definieren eine benutzerdefinierte Java-Klasse namens „ JavaExchanger “ in der Datei „ JavaExchanger.java “:
package org.qtproject.example.androidlanguageexchange;
public class JavaExchanger
{
private long mCppExchanger;
private native void connectToCppExchanger(long cppExchanger);
private native void fromOther(long cppExchanger, String str);
public JavaExchanger(long cppExchanger) {
mCppExchanger = cppExchanger;
connectToCppExchanger(cppExchanger);
}
public void fromCpp(int type, String str) {
if (type == OtherLanguageType.Java.getCode()) {
String msg = str + " And hello back to you from\nJava!";
fromOther(mCppExchanger, msg);
}
}
}Wir definieren eine benutzerdefinierte Kotlin-Klasse namens „ KotlinExchanger “ in der Datei „ KotlinExchanger.kt “:
package org.qtproject.example.androidlanguageexchange;
class KotlinExchanger(private val cppExchanger: Long) {
private external fun connectToCppExchanger(cppExchanger: Long)
private external fun fromOther(cppExchanger: Long, str: String)
init {
connectToCppExchanger(cppExchanger)
}
fun fromCpp(type: Int, str: String) {
if (type == OtherLanguageType.Kotlin.code) {
val msg = "$str And hello back to you from\nKotlin!"
fromOther(cppExchanger, msg)
}
}
}Beide Klassen nehmen einen „long integer“ entgegen, bei dem es sich lediglich um einen nach „long“ umgewandelten „ QObject* “ handelt. Wenn die Funktionen „ fromCpp “ infolge des Aufrufs der Funktion „ connectToCppExchanger “ aufgerufen werden, ändern sie die eingehende Zeichenfolge und senden sie zusammen mit dem „long int“ an „ fromOther “ zurück.
In der Header-Datei der C++-Klasse „DataExchanger“, dataexchanger.h, deklarieren wir eine einfache C++-API zum Datenaustausch zwischen C++ und Kotlin/Java. Sie besteht aus „ QObject “ mit einem „ fromCpp “-Signal, das vom C++-Code als Reaktion auf die Schaltflächen gesendet wird, und einem „ fromOther “-Signal, über das der Java/Kotlin-Code, wie zuvor beschrieben, eine Zeichenkette an den C++-Code sendet.
// A simple data exchanger. All this class does is convey semi-abstract data
// back and forth. For the purposes of this example, treat it as an opaque
// and not necessarily modifiable engine object that just happens to have
// a signal that's directly consumable by the code in other languages. The
// rest of the glue is done in OtherLanguageHandler.
class DataExchanger : public QObject
{
Q_OBJECT
public:
explicit DataExchanger(QObject *parent = nullptr);
enum OtherLanguageType {Java, Kotlin};
signals:
void fromCpp(OtherLanguageType type, const QString& str);
void fromOther(const QString& str);
};Der Aufruf der Java-Methode erfolgt über ` QJniObject `, das zur Kommunikation mit Java/Kotlin auf die JNI-APIs (Java Native Interface) zurückgreift. Das Argument vom Typ „long integer“ wird zurück in den Typ ` DataExchanger ` umgewandelt, und das Signal ` fromCpp ` wird anschließend mit einem Lambda-Ausdruck verbunden, der die Java/Kotlin-Funktion ` fromCpp ` aufruft.
// We provide this function so that the Java/Kotlin objects can register themselves
// as signal observers. The C++ code doesn't decide where and when that happens.
void connectToCppExchanger(JNIEnv* /*env*/, jobject thiz, jlong cppExchanger)
{
DataExchanger* exchanger = reinterpret_cast<DataExchanger*>(cppExchanger);
QJniObject androidExchanger(thiz);
QObject::connect(exchanger, &DataExchanger::fromCpp, exchanger,
// Intentional, and important capture by value of the QJniObject.
// This keeps the underlying Java/Kotlin object alive until the call
// to it is performed.
[androidExchanger](DataExchanger::OtherLanguageType type, const QString& str) {
androidExchanger.callMethod("fromCpp",
static_cast<int>(type), str);
});
}Der Aufruf einer nativen Methode der Java/Kotlin-Klasse wird an die Klasse „ DataExchanger “ weitergeleitet, indem die „long integer“-Zahl erneut in „ DataExchanger “ umgewandelt und anschließend das Signal „ fromOther “ dieses Typs aufgerufen wird.
// The Java/Kotlin code calls this. The C++ code doesn't decide where and when
// it is called.
// Note that the function must be registered with the Qt native method
// registration facilities because it relies on the Qt wrapping that knows how to
// convert a jstring to a QString.
void fromOther(JNIEnv* /*env*/, jobject /*thiz*/,
jlong cppExchanger, const QString &str)
{
DataExchanger* exchanger = reinterpret_cast<DataExchanger*>(cppExchanger);
exchanger->fromOther(str);
}Um sicherzustellen, dass unsere Schaltflächen wie vorgesehen funktionieren, fügen wir den folgenden Code hinzu, um das Senden einer Zeichenkette an Java/Kotlin auszulösen und die geänderte Zeichenkette zurückzubekommen:
QObject::connect(&javaButton, &QPushButton::clicked, &javaButton, [&]() {
dataExchanger.fromCpp(DataExchanger::Java, "Hello!");
});
QObject::connect(&kotlinButton, &QPushButton::clicked, &kotlinButton, [&]() {
dataExchanger.fromCpp(DataExchanger::Kotlin, "Hello!");
});
QObject::connect(&dataExchanger, &DataExchanger::fromOther,
&dataExchanger, [&](const QString& str) {
fromOtherLabel.setText(str);
});Siehe auch Qt für Android.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.