gpt4 book ai didi

java - 来自 Java 的 Qt Android : How to call Toast. makeText?

转载 作者:行者123 更新时间:2023-11-30 05:29:01 24 4
gpt4 key购买 nike

我想在 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);
}

ma​​in.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();
}

ma​​in.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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com