2016-04-12 14 views
1

Ich möchte Toast.makeText-Methode von Java in Qt/C++ aufrufen. Codes: Ich habe QT + = androidextras in .pro-Datei hinzugefügt.Qt Android: So rufen Sie Toast.makeText von Java?

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) 
    } 
} 

Ich bekomme diese Fehlermeldung:

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 

Ich glaube, ich für getApplicationContext android Kontext benötigen(), aber Ich weiß nicht, wie ich den Kontext bekommen kann. Wie kann ich die Toast.makeText-Methode mit Qt/C++ JNI aufrufen? Vielen Dank.

Antwort

0

Um den Kontext zu erhalten, benötigen Sie eine Aktivität. Das bedeutet, dass Sie die Standard-Qt-Aktivität erweitern und für Ihre Toast-Klasse zugänglich machen müssen.

In diesem Dokument wird erläutert, wie das jni mit Qt verwendet wird. Auf Seite 42 ist ein Beispiel für eine überschriebene QtActivity:

https://www.qtdeveloperdays.com/sites/default/files/BogdanVatra_Extending_Qt_Android_Apps_with_JNI.pdf#page=42

// src/com/kdab/training/MyActivity.java 
package com.kdab.training; 

import android.os.Bundle; 
import org.qtproject.qt5.android.bindings.QtActivity; 

public class MyActivity extends QtActivity 
{ 
    // we'll need it in BroadcastReceiver 
    public static MyActivity s_activity = null; 

    // every time you override a method, always make sure you 
    // then call super method as well 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     s_activity = this; 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    protected void onDestroy() 
    { 
     super.onDestroy(); 
     s_activity = null; 
    } 
} 
+0

Dank, habe ich diesen Code und ich fügte AndroidManifest.xml aber ich gleiche Fehler . Ich kenne Java nicht gut. Also verstehe ich Codes auf der Webseite nicht. Kannst du mir helfen? Sollte ich es dann tun? –

1

Sie müssen QtActivity Klasse erweitern. und rufen runOnUiThread zum Anrufen von Android Toas-Klasse. Erster Android Java-Klasse erstellen:

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(); 
        } 
       }); 
    } 
} 

jetzt in cpp Klasse diesen Code verwendet für den Aufruf MyToast.makeText Methode:

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>()); 
Verwandte Themen