我想在 Qt/C++ 中从 Java 调用 Toast.makeText 方法。代码: 我在 .pro 文件中添加了 QT += androidextras。
Toast.java:
package com.classes.java;
public class Toast {
public static void makeText(String text, int duration) {
Toast.makeText(getApplicationContext(), text, duration).show();
}
}
toast.h:
#ifndef TOAST_H
#define TOAST_H
#include <QObject>
#include <QAndroidJniObject>
class Toast : public QObject
{
Q_OBJECT
public:
explicit Toast(QObject* parent = 0);
Q_INVOKABLE void make_text(QString& text, int duration);
signals:
public slots:
};
#endif // TOAST_H
toast.cpp:
#include "toast.h"
Toast::Toast(QObject* parent) : QObject(parent)
{
}
void Toast::make_text(QString& text, int duration)
{
QAndroidJniObject txt = QAndroidJniObject::fromString(text);
QAndroidJniObject::callStaticObjectMethod(
"com/classes/java/Toast",
"makeText",
"(Ljava/lang/String;I)V",
txt.object<jstring>(), duration);
}
main.cpp:
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QtQml>
#include "toast.h"
int main(int argc, char* argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
qmlRegisterType<Toast>("java.class", 1, 0, "Toast");
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
main.qml:
import QtQuick 2.6
import QtQuick.Window 2.2
import Qt.labs.controls 1.0
import java.class 1.0;
Window {
visible: true
Toast {
id: toast
}
Button {
id: button
text: "Click Me!"
onClicked: toast.make_text("Hello World!", 2000)
}
}
我收到此错误消息:
UserPath\build-QtMobileTest-Android_for_armeabi_v7a_GCC_4_9_Qt_5_6_0-Release\android-build\src\com\classes\java\Toast.java:9: error: cannot find symbol
Toast.makeText(getApplicationContext(), text, duration).show();
^
symbol: method getApplicationContext()
location: class Toast
Note: UserPath\build-QtMobileTest-Android_for_armeabi_v7a_GCC_4_9_Qt_5_6_0-Release\android-build\__qt5__android__files__\src\org\qtproject\qt5\android\bindings\QtActivity.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
1 error
:compileDebugJava FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':compileDebugJava'.
> Compilation failed; see the compiler error output for details.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
我想我需要 getApplicationContext() 的 android 上下文,但我不知道如何获取上下文?如何使用 Qt/C++ JNI 调用 Toast.makeText 方法?谢谢。
最佳答案
您必须扩展 QtActivity 类。并调用 runOnUiThread 来调用 android Toas 类。首先创建android java类:
package org.qtproject.example.mytoast;
import android.content.Context;
import android.widget.Toast;
public class MyToast extends org.qtproject.qt5.android.bindings.QtActivity
{
private static MyToast m_instance;
public MyToast ()
{
m_instance = this;
}
public static void makeText(final String message)
{
m_instance.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(m_instance.getApplicationContext(),
message,
Toast.LENGTH_SHORT).show();
}
});
}
}
现在在 cpp 类中使用此代码调用 MyToast.makeText 方法:
QString toastMessage = "Your toast message!!!";
QAndroidJniObject myToast= QAndroidJniObject::fromString(toastMessage );
QAndroidJniObject::callStaticMethod<void>("org/qtproject/example/mytoast/MyToast",
"makeText",
"(Ljava/lang/String;)V",
myToast.object<jstring>());
关于java - 来自 Java 的 Qt Android : How to call Toast. makeText?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36579532/