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

标签 java android c++ qt

我想在 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/

相关文章:

android - 生成的 .aar 文件给出空的 classes.jar

java - 运行时的<init>方法

java - jsp渲染后的AOP切入点

java - 计费系统 - 编程

android - Android错误: ActivityThread.performLaunchActivity

java - 返回 Activity 时失去 Intent 附加功能

C++ 检测习语失败与继承

c++ - C/C++ 和 GNU/PGI : undefined reference to `__pgio_ini'

c++ - 无法在阵列添加和性能问题 CPU 与 GPU 中更改超过 10000 的阵列大小

java - IntelliJ : Why are my libraries not being recognized/downloaded?