Ich habe eine Android-App, die ungelesene Facebook-Benachrichtigungen und Posteingänge abruft. Die Anwendung muss in QT erstellt werden, aber ich kenne QT C++ kaum, deshalb habe ich die App in Java entwickelt und rufe die Java-Klasse einfach von QT aus mit JNI auf. Das funktioniert gut, aber ich muss jedes Mal einen Slot (auf der QT-Seite) senden, wenn es eine neue Facebook-Benachrichtigung/Nachricht gibt.
Also meine Frage ist: Wie benachrichtige ich QT aus Java heraus jede Minute darüber, dass ich eine neue Nachricht habe und die Zeichenfolge sende?
Das ist mein Java-Code:
Hauptklasse:
public class MainActivity extends FragmentActivity {
...
static public void startFacebookActivity() {
String msgTag = "FACEBOOK_APP";
try {
Activity mother = QtNative.activity();
Intent intent = new Intent(mother, MainActivity.class);
mother.startActivity(intent);
} catch (Exception e) {
Log.e(msgTag, e.toString());
e.printStackTrace();
}
}
}
Fragmentklasse (Überprüft jede Minute, ob eine neue Facebook-Nachricht vorhanden ist. Wenn ja, sollte sie QT benachrichtigen und die Nachricht senden, damit QT in der Lage ist, einen Slot zu senden.)
private static native void publishNotification(String notification);
....
if (newNotification==true)
publishNotification(responseNotification);
...
QT-Seite
facebookAndroid.cpp
#include "facebookAndroid.h"
#include
FacebookAndroid* FacebookAndroid::s_instance = 0;
FacebookAndroid::FacebookAndroid(QObject *parent) : QObject(parent) { s_instance = this;}
void FacebookAndroid::startAndroidFacebook() {
QAndroidJniObject::callStaticMethod("org.qtproject.example.MainActivity",
"startFacebookActivity",
"()V");
}
FacebookAndroid* FacebookAndroid::instance() {
return s_instance;
}
static void publishNotification(JNIEnv *env, jclass /*clazz*/, jstring notification) {
const char* nativeString = env->GetStringUTFChars(notification, 0);
FacebookAndroid::instance()->handleNewNotification(QString(nativeString));
}
static JNINativeMethod methods[] = {
{"publishNotification", "(Ljava/lang/String;)V", (void *)publishNotification}
};
jint JNICALL JNI_OnLoad(JavaVM *vm, void *) {
JNIEnv *env;
if (vm->GetEnv(reinterpret_cast(&env), JNI_VERSION_1_4) != JNI_OK)
return JNI_FALSE;
jclass clazz = env->FindClass("org/qtproject/example/MainActivity");
if (env->RegisterNatives(clazz, methods, sizeof(methods) / sizeof(methods[0])) < 0)
return JNI_FALSE;
return JNI_VERSION_1_4;
}
main.cpp
#include
#include "qtquick2applicationviewer.h"
#include
#include "facebookAndroid.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QtQuick2ApplicationViewer viewer;
FacebookAndroid sa(&viewer);
viewer.rootContext()->setContextProperty(QString("iniciaFacebook"), &sa);
viewer.setMainQmlFile(QStringLiteral("qml/FacebookTry/main.qml"));
viewer.showExpanded();
return app.exec();
}
facebookAndroid.h
#ifndef FACEBOOKANDROID_H
#define FACEBOOKANDROID_H
#include
#include
class FacebookAndroid : public QObject {
Q_OBJECT
public:
FacebookAndroid(QObject *parent = 0);
FacebookAndroid* instance();
void handleNewNotification(QString notification);
protected:
static FacebookAndroid *s_instance;
public slots:
void startAndroidFacebook();
};
#endif // FACEBOOKANDROID_H
FEHLER BEIM BAUEN
In Funktion 'void publisNotification(JNIEnv*, jclass,jstring)'
kann die Membervariable 'FacebookAnddroid::instance()' nicht ohne Objekt aufgerufen werden
FacebookAndroid::instance()->handleNewNotification(QString(nativeString));
in facebookAndroid.cpp
Jede Hilfe wäre sehr hilfreich.