2016-04-12 8 views
1

Qt/C++でJavaからToast.makeTextメソッドを呼び出したいとします。コード: QT + = androidextrasを.proファイルに追加しました。Qt Android:JavaからToast.makeTextを呼び出す方法は?

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

私は、このエラーメッセージが出ます:私はgetApplicationContext(のためのAndroidの文脈が必要だと思う

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 

を)が、私はどのように文脈を得ることができないのですか? Qt/C++ JNIを使​​用してToast.makeTextメソッドを呼び出すにはどうすればよいですか?ありがとう。

答えて

0

コンテキストを取得するには、アクティビティが必要です。つまり、デフォルトのQtアクティビティを拡張し、Toastクラスにアクセスできるようにする必要があります。

このドキュメントでは、jni with Qtを使用する方法について説明します。 42ページのオーバーライド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

おかげで、私はこのコードを追加し、私はのAndroidManifest.xmlを追加しましたが、私は同じエラーを取得します。私はよくJavaを知らない。だから私はウェブページ上のコードを理解していない。手伝って頂けますか?私はしなければならない? –

1

あなたはQtActivityクラスを拡張する必要があります。 android Toasクラスを呼び出すためのrunOnUiThreadを呼び出します。 MyToast.makeTextメソッドを呼び出すためのcppクラスの使用で、今、このコードを

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

:初のAndroidのJavaクラスを作成

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>()); 
関連する問題