Source

Target

Commits (2)
Showing with 88 additions and 32 deletions
......@@ -35,11 +35,65 @@
This example demonstrates how to add a custom Java class to an Android application, and
how to call into this using the JNI convenience APIs in the Qt Android Extras module.
The application UI is created by using Qt Quick.
Click on either of the smiley faces to put a notification in the status area of the Android
device.
\include examples-run.qdocinc
\section1 Calling Java Methods from C++ Code
We define a custom Java class called \c NotificationClient in the
NotificationClient.java file:
\quotefromfile notification/android-sources/src/org/qtproject/example/notification/NotificationClient.java
\skipto org.qtproject.example.notification
\printuntil /^\}/
In the NotificationClient C++ class header file, notificationclient.h, we
declare a simple C++ API to display notifications on an Android device. It
consists of a single string property, \c notification, and a slot,
\c updateAndroidNotification(), that calls the Java code:
\quotefromfile notification/notificationclient.h
\skipto Q_PROPERTY
\printuntil )
\dots
\skipto private slots
\printuntil updateAndroidNotification()
A NotificationClient object is exposed to the QML in the main source file,
main.cpp:
\quotefromfile notification/main.cpp
\skipto QQuickView view;
\printuntil notificationClient);
In the NotificationClient C++ class source file, notificationclient.cpp, we
import the QtAndroidJniObject class to be able to use its functions:
\quotefromfile notification/notificationclient.cpp
\skipto QAndroidJniObject
\printuntil >
We connect the \c notificationChanged() signal to the
\c updateAndroidNotification() slot to update the notification text when the
\c notification property changes:
\printuntil }
The \c NotificationClient::updateAndroidNotification() function calls the
Java method. We construct a Java string from the \c notification string
property:
\skipto updateAndroidNotification()
\printuntil fromString
And pass the string object as a parameter to the Java \c notify() method.
Note that we must supply the signature ourselves:
\printuntil }
\sa {Qt for Android}, {Qt Android Extras}
*/
......@@ -716,16 +716,18 @@ QT_BEGIN_NAMESPACE
QAndroidJniObject::QAndroidJniObject(const char *className, const char *sig, ...)
{
va_list args;
QJNIObjectPrivate::QVaListPrivate vargs = { args };
va_start(args, sig);
d = QSharedPointer<QJNIObjectPrivate>(new QJNIObjectPrivate(className, sig, args));
d = QSharedPointer<QJNIObjectPrivate>(new QJNIObjectPrivate(className, sig, vargs));
va_end(args);
}
QAndroidJniObject::QAndroidJniObject(jclass clazz, const char *sig, ...)
{
va_list args;
QJNIObjectPrivate::QVaListPrivate vargs = { args };
va_start(args, sig);
d = QSharedPointer<QJNIObjectPrivate>(new QJNIObjectPrivate(clazz, sig, args));
d = QSharedPointer<QJNIObjectPrivate>(new QJNIObjectPrivate(clazz, sig, vargs));
va_end(args);
}
......@@ -757,7 +759,7 @@ void QAndroidJniObject::callMethod<void>(const char *methodName, const char *sig
{
va_list args;
va_start(args, sig);
d->callMethod<void>(methodName, sig, args);
d->callMethodV<void>(methodName, sig, args);
va_end(args);
}
......@@ -766,7 +768,7 @@ jboolean QAndroidJniObject::callMethod<jboolean>(const char *methodName, const c
{
va_list args;
va_start(args, sig);
jboolean res = d->callMethod<jboolean>(methodName, sig, args);
jboolean res = d->callMethodV<jboolean>(methodName, sig, args);
va_end(args);
return res;
}
......@@ -776,7 +778,7 @@ jbyte QAndroidJniObject::callMethod<jbyte>(const char *methodName, const char *s
{
va_list args;
va_start(args, sig);
jbyte res = d->callMethod<jbyte>(methodName, sig, args);
jbyte res = d->callMethodV<jbyte>(methodName, sig, args);
va_end(args);
return res;
}
......@@ -786,7 +788,7 @@ jchar QAndroidJniObject::callMethod<jchar>(const char *methodName, const char *s
{
va_list args;
va_start(args, sig);
jchar res = d->callMethod<jchar>(methodName, sig, args);
jchar res = d->callMethodV<jchar>(methodName, sig, args);
va_end(args);
return res;
}
......@@ -796,7 +798,7 @@ jshort QAndroidJniObject::callMethod<jshort>(const char *methodName, const char
{
va_list args;
va_start(args, sig);
jshort res = d->callMethod<jshort>(methodName, sig, args);
jshort res = d->callMethodV<jshort>(methodName, sig, args);
va_end(args);
return res;
}
......@@ -806,7 +808,7 @@ jint QAndroidJniObject::callMethod<jint>(const char *methodName, const char *sig
{
va_list args;
va_start(args, sig);
jint res = d->callMethod<jint>(methodName, sig, args);
jint res = d->callMethodV<jint>(methodName, sig, args);
va_end(args);
return res;
}
......@@ -816,7 +818,7 @@ jlong QAndroidJniObject::callMethod<jlong>(const char *methodName, const char *s
{
va_list args;
va_start(args, sig);
jlong res = d->callMethod<jlong>(methodName, sig, args);
jlong res = d->callMethodV<jlong>(methodName, sig, args);
va_end(args);
return res;
}
......@@ -826,7 +828,7 @@ jfloat QAndroidJniObject::callMethod<jfloat>(const char *methodName, const char
{
va_list args;
va_start(args, sig);
jfloat res = d->callMethod<jfloat>(methodName, sig, args);
jfloat res = d->callMethodV<jfloat>(methodName, sig, args);
va_end(args);
return res;
}
......@@ -836,7 +838,7 @@ jdouble QAndroidJniObject::callMethod<jdouble>(const char *methodName, const cha
{
va_list args;
va_start(args, sig);
jdouble res = d->callMethod<jdouble>(methodName, sig, args);
jdouble res = d->callMethodV<jdouble>(methodName, sig, args);
va_end(args);
return res;
}
......@@ -847,7 +849,7 @@ QAndroidJniObject QAndroidJniObject::callObjectMethod(const char *methodName,
{
va_list args;
va_start(args, sig);
QJNIObjectPrivate res = d->callObjectMethod(methodName, sig, args);
QJNIObjectPrivate res = d->callObjectMethodV(methodName, sig, args);
va_end(args);
return res;
}
......@@ -962,7 +964,7 @@ void QAndroidJniObject::callStaticMethod<void>(const char *className,
{
va_list args;
va_start(args, sig);
QJNIObjectPrivate::callStaticMethod<void>(className, methodName, sig, args);
QJNIObjectPrivate::callStaticMethodV<void>(className, methodName, sig, args);
va_end(args);
}
......@@ -974,7 +976,7 @@ void QAndroidJniObject::callStaticMethod<void>(jclass clazz,
{
va_list args;
va_start(args, sig);
QJNIObjectPrivate::callStaticMethod<void>(clazz, methodName, sig, args);
QJNIObjectPrivate::callStaticMethodV<void>(clazz, methodName, sig, args);
va_end(args);
}
......@@ -986,7 +988,7 @@ jboolean QAndroidJniObject::callStaticMethod<jboolean>(const char *className,
{
va_list args;
va_start(args, sig);
jboolean res = QJNIObjectPrivate::callStaticMethod<jboolean>(className, methodName, sig, args);
jboolean res = QJNIObjectPrivate::callStaticMethodV<jboolean>(className, methodName, sig, args);
va_end(args);
return res;
}
......@@ -999,7 +1001,7 @@ jboolean QAndroidJniObject::callStaticMethod<jboolean>(jclass clazz,
{
va_list args;
va_start(args, sig);
jboolean res = QJNIObjectPrivate::callStaticMethod<jboolean>(clazz, methodName, sig, args);
jboolean res = QJNIObjectPrivate::callStaticMethodV<jboolean>(clazz, methodName, sig, args);
va_end(args);
return res;
}
......@@ -1012,7 +1014,7 @@ jbyte QAndroidJniObject::callStaticMethod<jbyte>(const char *className,
{
va_list args;
va_start(args, sig);
jbyte res = QJNIObjectPrivate::callStaticMethod<jbyte>(className, methodName, sig, args);
jbyte res = QJNIObjectPrivate::callStaticMethodV<jbyte>(className, methodName, sig, args);
va_end(args);
return res;
}
......@@ -1025,7 +1027,7 @@ jbyte QAndroidJniObject::callStaticMethod<jbyte>(jclass clazz,
{
va_list args;
va_start(args, sig);
jbyte res = QJNIObjectPrivate::callStaticMethod<jbyte>(clazz, methodName, sig, args);
jbyte res = QJNIObjectPrivate::callStaticMethodV<jbyte>(clazz, methodName, sig, args);
va_end(args);
return res;
}
......@@ -1038,7 +1040,7 @@ jchar QAndroidJniObject::callStaticMethod<jchar>(const char *className,
{
va_list args;
va_start(args, sig);
jchar res = QJNIObjectPrivate::callStaticMethod<jchar>(className, methodName, sig, args);
jchar res = QJNIObjectPrivate::callStaticMethodV<jchar>(className, methodName, sig, args);
va_end(args);
return res;
}
......@@ -1051,7 +1053,7 @@ jchar QAndroidJniObject::callStaticMethod<jchar>(jclass clazz,
{
va_list args;
va_start(args, sig);
jchar res = QJNIObjectPrivate::callStaticMethod<jchar>(clazz, methodName, sig, args);
jchar res = QJNIObjectPrivate::callStaticMethodV<jchar>(clazz, methodName, sig, args);
va_end(args);
return res;
}
......@@ -1065,7 +1067,7 @@ jshort QAndroidJniObject::callStaticMethod<jshort>(const char *className,
{
va_list args;
va_start(args, sig);
jshort res = QJNIObjectPrivate::callStaticMethod<jshort>(className, methodName, sig, args);
jshort res = QJNIObjectPrivate::callStaticMethodV<jshort>(className, methodName, sig, args);
va_end(args);
return res;
}
......@@ -1078,7 +1080,7 @@ jshort QAndroidJniObject::callStaticMethod<jshort>(jclass clazz,
{
va_list args;
va_start(args, sig);
jshort res = QJNIObjectPrivate::callStaticMethod<jshort>(clazz, methodName, sig, args);
jshort res = QJNIObjectPrivate::callStaticMethodV<jshort>(clazz, methodName, sig, args);
va_end(args);
return res;
}
......@@ -1091,7 +1093,7 @@ jint QAndroidJniObject::callStaticMethod<jint>(const char *className,
{
va_list args;
va_start(args, sig);
jint res = QJNIObjectPrivate::callStaticMethod<jint>(className, methodName, sig, args);
jint res = QJNIObjectPrivate::callStaticMethodV<jint>(className, methodName, sig, args);
va_end(args);
return res;
}
......@@ -1104,7 +1106,7 @@ jint QAndroidJniObject::callStaticMethod<jint>(jclass clazz,
{
va_list args;
va_start(args, sig);
jint res = QJNIObjectPrivate::callStaticMethod<jint>(clazz, methodName, sig, args);
jint res = QJNIObjectPrivate::callStaticMethodV<jint>(clazz, methodName, sig, args);
va_end(args);
return res;
}
......@@ -1117,7 +1119,7 @@ jlong QAndroidJniObject::callStaticMethod<jlong>(const char *className,
{
va_list args;
va_start(args, sig);
jlong res = QJNIObjectPrivate::callStaticMethod<jlong>(className, methodName, sig, args);
jlong res = QJNIObjectPrivate::callStaticMethodV<jlong>(className, methodName, sig, args);
va_end(args);
return res;
}
......@@ -1130,7 +1132,7 @@ jlong QAndroidJniObject::callStaticMethod<jlong>(jclass clazz,
{
va_list args;
va_start(args, sig);
jlong res = QJNIObjectPrivate::callStaticMethod<jlong>(clazz, methodName, sig, args);
jlong res = QJNIObjectPrivate::callStaticMethodV<jlong>(clazz, methodName, sig, args);
va_end(args);
return res;
}
......@@ -1143,7 +1145,7 @@ jfloat QAndroidJniObject::callStaticMethod<jfloat>(const char *className,
{
va_list args;
va_start(args, sig);
jfloat res = QJNIObjectPrivate::callStaticMethod<jfloat>(className, methodName, sig, args);
jfloat res = QJNIObjectPrivate::callStaticMethodV<jfloat>(className, methodName, sig, args);
va_end(args);
return res;
}
......@@ -1156,7 +1158,7 @@ jfloat QAndroidJniObject::callStaticMethod<jfloat>(jclass clazz,
{
va_list args;
va_start(args, sig);
jfloat res = QJNIObjectPrivate::callStaticMethod<jfloat>(clazz, methodName, sig, args);
jfloat res = QJNIObjectPrivate::callStaticMethodV<jfloat>(clazz, methodName, sig, args);
va_end(args);
return res;
}
......@@ -1169,7 +1171,7 @@ jdouble QAndroidJniObject::callStaticMethod<jdouble>(const char *className,
{
va_list args;
va_start(args, sig);
jdouble res = QJNIObjectPrivate::callStaticMethod<jdouble>(className, methodName, sig, args);
jdouble res = QJNIObjectPrivate::callStaticMethodV<jdouble>(className, methodName, sig, args);
va_end(args);
return res;
}
......@@ -1182,7 +1184,7 @@ jdouble QAndroidJniObject::callStaticMethod<jdouble>(jclass clazz,
{
va_list args;
va_start(args, sig);
jdouble res = QJNIObjectPrivate::callStaticMethod<jdouble>(clazz, methodName, sig, args);
jdouble res = QJNIObjectPrivate::callStaticMethodV<jdouble>(clazz, methodName, sig, args);
va_end(args);
return res;
}
......@@ -1194,7 +1196,7 @@ QAndroidJniObject QAndroidJniObject::callStaticObjectMethod(const char *classNam
{
va_list args;
va_start(args, sig);
QJNIObjectPrivate res = QJNIObjectPrivate::callStaticObjectMethod(className,
QJNIObjectPrivate res = QJNIObjectPrivate::callStaticObjectMethodV(className,
methodName,
sig,
args);
......@@ -1209,7 +1211,7 @@ QAndroidJniObject QAndroidJniObject::callStaticObjectMethod(jclass clazz,
{
va_list args;
va_start(args, sig);
QJNIObjectPrivate res = QJNIObjectPrivate::callStaticObjectMethod(clazz, methodName, sig, args);
QJNIObjectPrivate res = QJNIObjectPrivate::callStaticObjectMethodV(clazz, methodName, sig, args);
va_end(args);
return res;
}
......