aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChristian Strømme <christian.stromme@digia.com>2013-09-19 12:33:56 +0200
committerChristian Stromme <christian.stromme@digia.com>2013-09-20 03:03:07 +0200
commite5d6abb31861f8e13b2348575e38daf0ca1511c3 (patch)
treea98454cb5c1a021031646587b9afcd5aaaa74823 /src
parent0ea86574a4ca430a16867d09776f76124f38d201 (diff)
Add Qt JNI API.
The QJNI API's provide an easy way to communicate with Java API's from C++. The API consists of two classes, QJNIObject which acts as a wrapper around Java classes and QJNIEnvironment which attaches the current thread to the Java VM and exposes the Java Native Interface. Change-Id: I9cdc395249de74f940b75eab9f2bd32347d5d432 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/androidextras/androidextras.pro7
-rw-r--r--src/androidextras/doc/qtandroidextras.qdocconf39
-rw-r--r--src/androidextras/doc/snippets/code/src_androidextras_qjnienvironment.cpp39
-rw-r--r--src/androidextras/doc/snippets/code/src_androidextras_qjniobject.cpp70
-rw-r--r--src/androidextras/doc/src/qtandroidextras-index.qdoc40
-rw-r--r--src/androidextras/doc/src/qtandroidextras-module.qdoc37
-rw-r--r--src/androidextras/jni/jni.pri7
-rw-r--r--src/androidextras/jni/qjnienvironment.cpp73
-rw-r--r--src/androidextras/jni/qjnienvironment.h70
-rw-r--r--src/androidextras/jni/qjniobject.cpp2061
-rw-r--r--src/androidextras/jni/qjniobject.h202
-rw-r--r--src/androidextras/qandroidextrasglobal.h61
-rw-r--r--src/src.pro2
13 files changed, 2708 insertions, 0 deletions
diff --git a/src/androidextras/androidextras.pro b/src/androidextras/androidextras.pro
new file mode 100644
index 0000000..fa89194
--- /dev/null
+++ b/src/androidextras/androidextras.pro
@@ -0,0 +1,7 @@
+TARGET = QtAndroidExtras
+DEFINES += QT_NO_USING_NAMESPACE
+#QMAKE_DOCS = $$PWD/doc/qtandroidextras.qdocconf
+QT -= gui
+QT += core-private
+load(qt_module)
+include(jni/jni.pri)
diff --git a/src/androidextras/doc/qtandroidextras.qdocconf b/src/androidextras/doc/qtandroidextras.qdocconf
new file mode 100644
index 0000000..9e123bb
--- /dev/null
+++ b/src/androidextras/doc/qtandroidextras.qdocconf
@@ -0,0 +1,39 @@
+include($QT_INSTALL_DOCS/global/qt-module-defaults.qdocconf)
+
+project = QtAndroidExtras
+description = Qt Android Extras Reference Documentation
+url = http://qt-project.org/doc/qt-$QT_VER/qtandroidextras
+version = $QT_VERSION
+
+examplesinstallpath = qtandroidextras
+
+qhp.projects = QtAndroidExtras
+
+qhp.QtAndroidExtras.file = qtandroidextras.qhp
+qhp.QtAndroidExtras.namespace = org.qt-project.qtandroidextras.$QT_VERSION_TAG
+qhp.QtAndroidExtras.virtualFolder = qtandroidextras
+qhp.QtAndroidExtras.indexTitle = Qt Android Extras
+qhp.QtAndroidExtras.indexRoot =
+
+qhp.QtAndroidExtras.filterAttributes = qtandroidextras $QT_VERSION qtrefdoc
+qhp.QtAndroidExtras.customFilters.Qt.name = QtAndroidExtras $QT_VERSION
+qhp.QtAndroidExtras.customFilters.Qt.filterAttributes = qtandroidextras $QT_VERSION
+
+qhp.QtAndroidExtras.subprojects = classes
+qhp.QtAndroidExtras.subprojects.classes.title = C++ Classes
+qhp.QtAndroidExtras.subprojects.classes.indexTitle = Qt Android Extras C++ Classes
+qhp.QtAndroidExtras.subprojects.classes.selectors = class fake:headerfile
+qhp.QtAndroidExtras.subprojects.classes.sortPages = true
+
+tagfile = ../../../doc/qtandroidextras/qtandroidextras.tags
+depends += qtcore
+headerdirs += ..
+sourcedirs += ..
+exampledirs += ../../../examples/qtandroidextras \
+ ../ \
+ snippets
+
+excludedirs += ../../../examples/widgets/doc
+imagedirs += images
+navigation.landingpage = "Qt Android Extras"
+navigation.cppclassespage = "Qt Android Extras C++ Classes"
diff --git a/src/androidextras/doc/snippets/code/src_androidextras_qjnienvironment.cpp b/src/androidextras/doc/snippets/code/src_androidextras_qjnienvironment.cpp
new file mode 100644
index 0000000..e799420
--- /dev/null
+++ b/src/androidextras/doc/snippets/code/src_androidextras_qjnienvironment.cpp
@@ -0,0 +1,39 @@
+/****************************************************************************
+ **
+ ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+ ** Contact: http://www.qt-project.org/legal
+ **
+ ** This file is part of the documentation of the Qt Toolkit.
+ **
+ ** $QT_BEGIN_LICENSE:BSD$
+ ** You may use this file under the terms of the BSD license as follows:
+ **
+ ** "Redistribution and use in source and binary forms, with or without
+ ** modification, are permitted provided that the following conditions are
+ ** met:
+ ** * Redistributions of source code must retain the above copyright
+ ** notice, this list of conditions and the following disclaimer.
+ ** * Redistributions in binary form must reproduce the above copyright
+ ** notice, this list of conditions and the following disclaimer in
+ ** the documentation and/or other materials provided with the
+ ** distribution.
+ ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
+ ** of its contributors may be used to endorse or promote products derived
+ ** from this software without specific prior written permission.
+ **
+ **
+ ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+ **
+ ** $QT_END_LICENSE$
+ **
+ ****************************************************************************/
diff --git a/src/androidextras/doc/snippets/code/src_androidextras_qjniobject.cpp b/src/androidextras/doc/snippets/code/src_androidextras_qjniobject.cpp
new file mode 100644
index 0000000..1ef86fe
--- /dev/null
+++ b/src/androidextras/doc/snippets/code/src_androidextras_qjniobject.cpp
@@ -0,0 +1,70 @@
+/****************************************************************************
+ **
+ ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+ ** Contact: http://www.qt-project.org/legal
+ **
+ ** This file is part of the documentation of the Qt Toolkit.
+ **
+ ** $QT_BEGIN_LICENSE:BSD$
+ ** You may use this file under the terms of the BSD license as follows:
+ **
+ ** "Redistribution and use in source and binary forms, with or without
+ ** modification, are permitted provided that the following conditions are
+ ** met:
+ ** * Redistributions of source code must retain the above copyright
+ ** notice, this list of conditions and the following disclaimer.
+ ** * Redistributions in binary form must reproduce the above copyright
+ ** notice, this list of conditions and the following disclaimer in
+ ** the documentation and/or other materials provided with the
+ ** distribution.
+ ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
+ ** of its contributors may be used to endorse or promote products derived
+ ** from this software without specific prior written permission.
+ **
+ **
+ ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+ **
+ ** $QT_END_LICENSE$
+ **
+ ****************************************************************************/
+
+//! [Working with lists]
+QStringList getTrackTitles(const QJNIObject &album) {
+ QStringList stringList;
+ QJNIObject list = album.callObjectMethod<jobject>("getTitles",
+ "()Ljava/util/List;");
+
+ if (list.isValid()) {
+ const int size = list.callMethod<jint>("size");
+ for (int i = 0; i < size; ++i) {
+ QJNIObject title = list.callObjectMethod<jobject>("get", "(I)Ljava/lang/Object;", i);
+ stringList.append(title.toString());
+ }
+ }
+ return stringList;
+}
+//! [Working with lists]
+
+//! [QJNIObject scope]
+void function()
+{
+ QString helloString("Hello");
+ jstring myJString = 0;
+ {
+ QJNIObject string = QJNIObject::fromString(string);
+ myJString = string.object<jstring>();
+ }
+
+ // Ops! myJString is no longer valid.
+}
+//! [QJNIObject scope]
diff --git a/src/androidextras/doc/src/qtandroidextras-index.qdoc b/src/androidextras/doc/src/qtandroidextras-index.qdoc
new file mode 100644
index 0000000..823e71e
--- /dev/null
+++ b/src/androidextras/doc/src/qtandroidextras-index.qdoc
@@ -0,0 +1,40 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Free Documentation License Usage
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of
+** this file. Please review the following information to ensure
+** the GNU Free Documentation License version 1.3 requirements
+** will be met: http://www.gnu.org/copyleft/fdl.html.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qtandroidextras-index.html
+ \title Qt Android Extras
+
+ \brief The Qt Android Extras module contains adittional functionality to aid development on Android.
+
+ \section1 Getting Started
+
+ \list
+
+ \endlist
+
+*/
diff --git a/src/androidextras/doc/src/qtandroidextras-module.qdoc b/src/androidextras/doc/src/qtandroidextras-module.qdoc
new file mode 100644
index 0000000..f62484e
--- /dev/null
+++ b/src/androidextras/doc/src/qtandroidextras-module.qdoc
@@ -0,0 +1,37 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Free Documentation License Usage
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of
+** this file. Please review the following information to ensure
+** the GNU Free Documentation License version 1.3 requirements
+** will be met: http://www.gnu.org/copyleft/fdl.html.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \module QtAndroidExtras
+ \title Qt Android Extras C++ Classes
+ \brief The Qt Android Extras module contains functionality to additional functionality to aid development on Android.
+
+ \ingroup modules
+ \qtvariable androidextras
+
+ The Qt Android Extras module adds...
+*/
diff --git a/src/androidextras/jni/jni.pri b/src/androidextras/jni/jni.pri
new file mode 100644
index 0000000..f702fee
--- /dev/null
+++ b/src/androidextras/jni/jni.pri
@@ -0,0 +1,7 @@
+HEADERS += \
+ $$PWD/qjniobject.h \
+ $$PWD/qjnienvironment.h
+
+SOURCES += \
+ $$PWD/qjniobject.cpp \
+ $$PWD/qjnienvironment.cpp
diff --git a/src/androidextras/jni/qjnienvironment.cpp b/src/androidextras/jni/qjnienvironment.cpp
new file mode 100644
index 0000000..f21d763
--- /dev/null
+++ b/src/androidextras/jni/qjnienvironment.cpp
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qjnienvironment.h"
+#include <QtCore/private/qjni_p.h>
+#include <QtCore/private/qjnihelpers_p.h>
+#include <QtCore/qthreadstorage.h>
+
+QT_BEGIN_NAMESPACE
+
+QJNIEnvironment::QJNIEnvironment()
+ : d(new QJNIEnvironmentPrivate)
+{
+}
+
+QJNIEnvironment::~QJNIEnvironment()
+{
+}
+
+JavaVM *QJNIEnvironment::javaVM()
+{
+ return QtAndroidPrivate::javaVM();
+}
+
+JNIEnv *QJNIEnvironment::operator->()
+{
+ return d->jniEnv;
+}
+
+QJNIEnvironment::operator JNIEnv*() const
+{
+ return d->jniEnv;
+}
+
+QT_END_NAMESPACE
diff --git a/src/androidextras/jni/qjnienvironment.h b/src/androidextras/jni/qjnienvironment.h
new file mode 100644
index 0000000..571f44e
--- /dev/null
+++ b/src/androidextras/jni/qjnienvironment.h
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QJNIENVIRONMENT_H
+#define QJNIENVIRONMENT_H
+
+#include <jni.h>
+#include <QtAndroidExtras/qandroidextrasglobal.h>
+#include <QtCore/qglobal.h>
+#include <QtCore/qscopedpointer.h>
+
+QT_BEGIN_NAMESPACE
+
+struct QJNIEnvironmentPrivate;
+
+class Q_ANDROIDEXTRAS_EXPORT QJNIEnvironment
+{
+public:
+ QJNIEnvironment();
+ ~QJNIEnvironment();
+ static JavaVM *javaVM();
+ JNIEnv *operator->();
+ operator JNIEnv*() const;
+
+private:
+ Q_DISABLE_COPY(QJNIEnvironment)
+ QScopedPointer<QJNIEnvironmentPrivate> d;
+};
+
+QT_END_NAMESPACE
+
+#endif // QJNIENVIRONMENT_H
diff --git a/src/androidextras/jni/qjniobject.cpp b/src/androidextras/jni/qjniobject.cpp
new file mode 100644
index 0000000..e5dc6e5
--- /dev/null
+++ b/src/androidextras/jni/qjniobject.cpp
@@ -0,0 +1,2061 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qjniobject.h"
+#include <QtCore/private/qjni_p.h>
+#include <QtCore/qhash.h>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QJNIObject
+ \inmodule QtAndroidExtras
+ \brief The QJNIObject ...
+ \since 5.2
+
+ \section1 Stub
+
+ Supported JNI object types:
+ \list
+ \li jobject
+ \li jclass
+ \li jstring
+ \li jarray
+ \li jobjectArray
+ \li jbooleanArray
+ \li jbyteArray
+ \li jcharArray
+ \li jshortArray
+ \li jintArray
+ \li jlongArray
+ \li jfloatArray
+ \li jdoubleArray
+ \endlist
+
+ Supported JNI Primitive types:
+ \list
+ \li jboolean
+ \li jbyte
+ \li jchar
+ \li jshort
+ \li jint
+ \li jlong
+ \li jfloat
+ \li jdouble
+ \endlist
+
+ About function types: ...
+
+ - Class name strings needs to be the fully-qualified class name, e.g., "java/lang/String".
+ - Method signatures are written as "(Arguments)ReturnType"
+ - All object types are returned as a QJNIObject.
+
+ More information about JNI can be found in the java doc [url]
+
+*/
+
+/*!
+ \fn QJNIObject::QJNIObject()
+
+ \code
+ \endcode
+*/
+
+/*!
+ \fn QJNIObject::QJNIObject(const char *className)
+
+ Constructs a new QJNIObject by calling the default constructor of \a className.
+
+ \code
+
+ ...
+ QJNIObject myJavaString("java/lang/String");
+ ...
+
+ \endcode
+*/
+
+/*!
+ \fn QJNIObject::QJNIObject(const char *className, const char *signature, ...)
+
+ Constructs a new QJNIObject by calling the constructor of \a className with \a signature
+ and arguments.
+
+ \code
+
+ ...
+ jstring myJStringArg = ...;
+ QJNIObject myNewJavaString("java/lang/String", "(Ljava/lang/String;)V", myJStringArg);
+ ...
+
+ \endcode
+*/
+
+/*!
+ \fn QJNIObject::QJNIObject(jclass clazz)
+
+ Constructs a new QJNIObject by calling the default constructor of \a clazz.
+
+ Note: The QJNIObject will create a new reference to the class \a clazz
+ and releases it again when it is destroyed. References to the class created
+ outside the QJNIObject needs to be managed by the caller.
+
+*/
+
+/*!
+ \fn QJNIObject::QJNIObject(jclass clazz, const char *signature, ...)
+
+ Constructs a new QJNIObject from \a clazz by calling the non-default
+ constructor with \a signature and arguments.
+
+ \code
+ \endcode
+*/
+
+/*!
+ \fn QJNIObject::QJNIObject(jobject object)
+
+ Constructs a new QJNIObject around the Java object \a object.
+
+ Note: The QJNIObject will hold a reference to the Java object \a object
+ and release it when destroyed. Any references to the Java object \a object
+ outside QJNIObject needs to be managed by the caller.
+*/
+
+/*!
+ \fn QJNIObject::~QJNIObject()
+
+ Destroys the QJNIObject and releases any references held by the QJNIObject.
+*/
+
+/*!
+ \fn T QJNIObject::callMethod(const char *methodName) const
+
+ Calls the Java object method \a methodName and returns the value.
+
+ \code
+ QJNIObject myJavaString = ...;
+ jint size = myJavaString.callMethod<jint>("length");
+ \endcode
+*/
+
+/*!
+ \fn T QJNIObject::callMethod(const char *methodName, const char *signature, ...) const
+
+ \code
+ \endcode
+*/
+
+/*!
+ \fn QJNIObject QJNIObject::callObjectMethod(const char *methodName) const
+
+ Calls the Java objects method \a methodName and returns a new QJNIObject for
+ the returned Java object.
+
+ \code
+ ...
+ QJNIObject myJavaString1 = ...;
+ QJNIObject myJavaString2 = myJavaString.callObjectMethod<jstring>("toString");
+ ...
+ \endcode
+*/
+
+/*!
+ \fn QJNIObject QJNIObject::callObjectMethod(const char *methodName, const char *signature, ...) const
+
+ Calls the Java object's method \a methodName with the signature \a signature and arguments
+
+ \code
+ QJNIObject myJavaString; ==> "Hello, Java"
+ QJNIObject mySubstring = myJavaString.callObjectMethod<jstring>("substring", "(II)Ljava/lang/String;" 7, 10);
+ \endcode
+*/
+
+/*!
+ \fn T QJNIObject::callStaticMethod(const char *className, const char *methodName)
+
+ \code
+ \endcode
+*/
+
+/*!
+ \fn T QJNIObject::callStaticMethod(const char *className, const char *methodName, const char *sig, ...)
+
+ \code
+ \endcode
+*/
+
+/*!
+ \fn T QJNIObject::callStaticMethod(jclass clazz, const char *methodName)
+
+ Calls the static method \a methodName on \a clazz and returns the value T.
+
+ \code
+ ...
+ jclass javaMathClass = ...; // ("java/lang/Math")
+ jdouble randNr = QJNIObject::callStaticMethod<jdouble>(javaMathClass, "random");
+ ...
+ \endcode
+*/
+
+/*!
+ \fn T QJNIObject::callStaticMethod(jclass clazz, const char *methodName, const char *signature, ...)
+
+ Calls the static method \a methodName with \a signature on \a clazz and returns the value T,
+ unless T is void.
+
+ \code
+ ...
+ jclass javaMathClass = ...; // ("java/lang/Math")
+ jint a = 2;
+ jint b = 4;
+ jint max = QJNIObject::callStaticMethod<jint>(javaMathClass, "max", "(II)I", a, b);
+ ...
+ \endcode
+*/
+
+/*!
+ \fn QJNIObject QJNIObject::callStaticObjectMethod(const char *className, const char *methodName)
+
+ \code
+ \endcode
+*/
+
+/*!
+ \fn QJNIObject QJNIObject::callStaticObjectMethod(const char *className, const char *methodName, const char *sig, ...)
+
+ \code
+ \endcode
+*/
+
+/*!
+ \fn QJNIObject QJNIObject::callStaticObjectMethod(jclass clazz, const char *methodName)
+
+ Calls the static \e object method \a methodName on \a clazz.
+ \code
+ \endcode
+*/
+
+/*!
+ \fn QJNIObject QJNIObject::callStaticObjectMethod(jclass clazz, const char *methodName, const char *signature, ...)
+
+ \code
+ \endcode
+*/
+
+/*!
+ \fn T QJNIObject::getField(const char *fieldName) const
+
+ \code
+ \endcode
+*/
+
+/*!
+ \fn T QJNIObject::getField(const char *fieldName, const char *sig) const
+
+ \code
+ \endcode
+*/
+
+/*!
+ \fn QJNIObject QJNIObject::getObjectField(const char *fieldName) const
+
+ \code
+ \endcode
+*/
+
+/*!
+ \fn QJNIObject QJNIObject::getObjectField(const char *fieldName, const char *signature) const
+
+ \code
+ \endcode
+*/
+
+/*!
+ \fn T QJNIObject::getStaticField(const char *className, const char *fieldName)
+
+ \code
+ \endcode
+*/
+
+/*!
+ \fn T QJNIObject::getStaticField(jclass clazz, const char *fieldName)
+
+ \code
+ \endcode
+*/
+
+/*!
+ \fn QJNIObject QJNIObject::getStaticObjectField(const char *className, const char *fieldName)
+
+ \code
+ \endcode
+*/
+
+/*!
+ \fn QJNIObject QJNIObject::getStaticObjectField(const char *className, const char *fieldName, const char *signature)
+
+ \code
+ \endcode
+*/
+
+/*!
+ \fn QJNIObject QJNIObject::getStaticObjectField(jclass clazz, const char *fieldName)
+
+ \code
+ \endcode
+*/
+
+/*!
+ \fn QJNIObject QJNIObject::getStaticObjectField(jclass clazz, const char *fieldName, const char *signature)
+
+ \code
+ \endcode
+*/
+
+/*!
+ \fn void QJNIObject::setField(const char *fieldName, T value)
+
+ \code
+ ...
+ QJNIObject obj;
+ obj.setField<jint>("AN_INT_FIELD", 10);
+ jstring myString = ...
+ obj.setField<jstring>("A_STRING_FIELD", myString);
+ ...
+ \endcode
+*/
+
+/*!
+ \fn void QJNIObject::setField(const char *fieldName, const char *signature, T value)
+
+ \code
+ \endcode
+*/
+
+/*!
+ \fn void QJNIObject::setStaticField(const char *className, const char *fieldName, T value)
+
+ \code
+ \endcode
+*/
+
+/*!
+ \fn void QJNIObject::setStaticField(const char *className, const char *fieldName, const char *sig, T value);
+
+ \code
+ \endcode
+*/
+
+/*!
+ \fn void QJNIObject::setStaticField(jclass clazz, const char *fieldName, T value)
+
+ \code
+ \endcode
+*/
+
+/*!
+ \fn void QJNIObject::setStaticField(jclass clazz, const char *fieldName, const char *sig, T value);
+
+ \code
+ \endcode
+*/
+
+/*!
+ \fn bool QJNIObject::isClassAvailable(const char *className)
+
+ Returns true if the Java class \a className is available.
+
+ \code
+ ...
+ if (QJNIObject::isClassAvailable("java/lang/String")) {
+ ...
+ }
+ ...
+ \endcode
+*/
+
+/*!
+ \fn bool QJNIObject::isValid() const
+
+ Returns true if this instance holds a valid Java object.
+
+ \code
+ ...
+ QJNIObject qjniObject; ==> isValid() == false
+ QJNIObject qjniObject(0) ==> isValid() == false
+ QJNIObject qjniObject("could/not/find/Class") ==> isValid() == false
+ ...
+ \endcode
+*/
+
+/*!
+ \fn T QJNIObject::object() const
+
+ Returns a jobject as type T.
+
+ \code
+ QJNIObject string = QJNIObject::fromString("Hello, JNI");
+ jstring jstring = string.object<jstring>();
+ \endcode
+
+ Note that the jobject is still owned by the QJNIObject. If you want to keep the jobject valid
+ you should create a new QJNIObject or make a new global reference to the jobject and
+ free it yourself.
+
+ \snippet code/src_androidextras_qjniobject.cpp QJNIObject scope
+*/
+
+/*!
+ \fn QJNIObject &QJNIObject::operator=(T object)
+
+ Replace the current object with \a object. The old Java object will be released.
+
+ \code
+ \endcode
+*/
+
+/*!
+ \fn QString QJNIObject::toString() const
+
+ Returns a QString with the data returned from calling the toString() function on a java object.
+ If the QJNIObject is wrapped around a Java String, calling this is a convenient way to convert
+ a Java string to a QString.
+
+ \code
+ \endcode
+*/
+
+/*!
+ \fn QJNIObject QJNIObject::fromString(const QString &string)
+
+ Creates a Java string from the QString \a string and returns a QJNIObject wrapping that string.
+
+ \code
+ ...
+ QString myQString = "QString";
+ QJNIObject myJavaString = QJNIObject::fromString(myQString);
+ ...
+ \endcode
+*/
+
+/*!
+ \fn bool operator==(const QJNIObject &o1, const QJNIObject &o2)
+ \relates QJNIObject
+
+ Returns true if both objects, \a o1 and \a o2, are referencing the same Java object, or if both
+ are NULL. In any other cases false will be returned.
+*/
+
+/*!
+ \fn bool operator==(const QJNIObject &o1, T o2)
+ \relates QJNIObject
+
+ Returns true if both objects, \a o1 and \a o2, are referencing the same Java object, or if both
+ are NULL. In any other cases false will be returned.
+*/
+
+/*!
+ \fn bool operator==(T o1, const QJNIObject &o2)
+ \relates QJNIObject
+
+ Returns true if both objects, \a o1 and \a o2, are referencing the same Java object, or if both
+ are NULL. In any other cases false will be returned.
+*/
+
+/*!
+ \fn bool operator!=(const QJNIObject &o1, const QJNIObject &o2)
+ \relates QJNIObject
+
+ Returns true if \a o1 holds a reference to a different object then \a o2.
+*/
+
+/*!
+ \fn bool operator!=(const QJNIObject &o1, T o2)
+ \relates QJNIObject
+
+ Returns true if \a o1 holds a reference to a different object then \a o2.
+*/
+
+/*!
+ \fn bool operator!=(T o1, const QJNIObject &o2)
+ \relates QJNIObject
+
+ Returns true if \a o1 is referencing a different object then \a o2.
+*/
+
+
+QJNIObject::QJNIObject(const char *className, const char *sig, ...)
+{
+ va_list args;
+ va_start(args, sig);
+ d = QSharedPointer<QJNIObjectPrivate>(new QJNIObjectPrivate(className, sig, args));
+ va_end(args);
+}
+
+QJNIObject::QJNIObject(jclass clazz, const char *sig, ...)
+{
+ va_list args;
+ va_start(args, sig);
+ d = QSharedPointer<QJNIObjectPrivate>(new QJNIObjectPrivate(clazz, sig, args));
+ va_end(args);
+}
+
+
+QJNIObject::QJNIObject() : d(new QJNIObjectPrivate)
+{
+
+}
+
+QJNIObject::QJNIObject(const char *className) : d(new QJNIObjectPrivate(className))
+{
+}
+
+QJNIObject::QJNIObject(jclass clazz) : d(new QJNIObjectPrivate(clazz))
+{
+}
+
+QJNIObject::QJNIObject(jobject obj) : d(new QJNIObjectPrivate(obj))
+{
+}
+
+QJNIObject::QJNIObject(const QJNIObjectPrivate &o) : d(new QJNIObjectPrivate(o))
+{
+
+}
+
+template <>
+void QJNIObject::callMethod<void>(const char *methodName, const char *sig, ...) const
+{
+ va_list args;
+ va_start(args, sig);
+ d->callMethod<void>(methodName, sig, args);
+ va_end(args);
+}
+
+template <>
+jboolean QJNIObject::callMethod<jboolean>(const char *methodName, const char *sig, ...) const
+{
+ va_list args;
+ va_start(args, sig);
+ jboolean res = d->callMethod<jboolean>(methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+template <>
+jbyte QJNIObject::callMethod<jbyte>(const char *methodName, const char *sig, ...) const
+{
+ va_list args;
+ va_start(args, sig);
+ jbyte res = d->callMethod<jbyte>(methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+template <>
+jchar QJNIObject::callMethod<jchar>(const char *methodName, const char *sig, ...) const
+{
+ va_list args;
+ va_start(args, sig);
+ jchar res = d->callMethod<jchar>(methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+template <>
+jshort QJNIObject::callMethod<jshort>(const char *methodName, const char *sig, ...) const
+{
+ va_list args;
+ va_start(args, sig);
+ jshort res = d->callMethod<jshort>(methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+template <>
+jint QJNIObject::callMethod<jint>(const char *methodName, const char *sig, ...) const
+{
+ va_list args;
+ va_start(args, sig);
+ jint res = d->callMethod<jint>(methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+template <>
+jlong QJNIObject::callMethod<jlong>(const char *methodName, const char *sig, ...) const
+{
+ va_list args;
+ va_start(args, sig);
+ jlong res = d->callMethod<jlong>(methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+template <>
+jfloat QJNIObject::callMethod<jfloat>(const char *methodName, const char *sig, ...) const
+{
+ va_list args;
+ va_start(args, sig);
+ jfloat res = d->callMethod<jfloat>(methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+template <>
+jdouble QJNIObject::callMethod<jdouble>(const char *methodName, const char *sig, ...) const
+{
+ va_list args;
+ va_start(args, sig);
+ jdouble res = d->callMethod<jdouble>(methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+QJNIObject QJNIObject::callObjectMethod(const char *methodName,
+ const char *sig,
+ ...) const
+{
+ va_list args;
+ va_start(args, sig);
+ QJNIObjectPrivate res = d->callObjectMethod(methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+template <>
+void QJNIObject::callMethod<void>(const char *methodName) const
+{
+ callMethod<void>(methodName, "()V");
+}
+
+template <>
+jboolean QJNIObject::callMethod<jboolean>(const char *methodName) const
+{
+ return callMethod<jboolean>(methodName, "()Z");
+}
+
+template <>
+jbyte QJNIObject::callMethod<jbyte>(const char *methodName) const
+{
+ return callMethod<jbyte>(methodName, "()B");
+}
+
+template <>
+jchar QJNIObject::callMethod<jchar>(const char *methodName) const
+{
+ return callMethod<jchar>(methodName, "()C");
+}
+
+template <>
+jshort QJNIObject::callMethod<jshort>(const char *methodName) const
+{
+ return callMethod<jshort>(methodName, "()S");
+}
+
+template <>
+jint QJNIObject::callMethod<jint>(const char *methodName) const
+{
+ return callMethod<jint>(methodName, "()I");
+}
+
+template <>
+jlong QJNIObject::callMethod<jlong>(const char *methodName) const
+{
+ return callMethod<jlong>(methodName, "()J");
+}
+
+template <>
+jfloat QJNIObject::callMethod<jfloat>(const char *methodName) const
+{
+ return callMethod<jfloat>(methodName, "()F");
+}
+
+template <>
+jdouble QJNIObject::callMethod<jdouble>(const char *methodName) const
+{
+ return callMethod<jdouble>(methodName, "()D");
+}
+
+template <>
+QJNIObject QJNIObject::callObjectMethod<jstring>(const char *methodName) const
+{
+ return d->callObjectMethod(methodName, "()Ljava/lang/String;");
+}
+
+template <>
+QJNIObject QJNIObject::callObjectMethod<jbooleanArray>(const char *methodName) const
+{
+ return d->callObjectMethod(methodName, "()[Z");
+}
+
+template <>
+QJNIObject QJNIObject::callObjectMethod<jbyteArray>(const char *methodName) const
+{
+ return d->callObjectMethod(methodName, "()[B");
+}
+
+template <>
+QJNIObject QJNIObject::callObjectMethod<jshortArray>(const char *methodName) const
+{
+ return d->callObjectMethod(methodName, "()[S");
+}
+
+template <>
+QJNIObject QJNIObject::callObjectMethod<jintArray>(const char *methodName) const
+{
+ return d->callObjectMethod(methodName, "()[I");
+}
+
+template <>
+QJNIObject QJNIObject::callObjectMethod<jlongArray>(const char *methodName) const
+{
+ return d->callObjectMethod(methodName, "()[J");
+}
+
+template <>
+QJNIObject QJNIObject::callObjectMethod<jfloatArray>(const char *methodName) const
+{
+ return d->callObjectMethod(methodName, "()[F");
+}
+
+template <>
+QJNIObject QJNIObject::callObjectMethod<jdoubleArray>(const char *methodName) const
+{
+ return d->callObjectMethod(methodName, "()[D");
+}
+
+template <>
+void QJNIObject::callStaticMethod<void>(const char *className,
+ const char *methodName,
+ const char *sig,
+ ...)
+{
+ va_list args;
+ va_start(args, sig);
+ QJNIObjectPrivate::callStaticMethod<void>(className, methodName, sig, args);
+ va_end(args);
+}
+
+template <>
+void QJNIObject::callStaticMethod<void>(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ ...)
+{
+ va_list args;
+ va_start(args, sig);
+ QJNIObjectPrivate::callStaticMethod<void>(clazz, methodName, sig, args);
+ va_end(args);
+}
+
+template <>
+jboolean QJNIObject::callStaticMethod<jboolean>(const char *className,
+ const char *methodName,
+ const char *sig,
+ ...)
+{
+ va_list args;
+ va_start(args, sig);
+ jboolean res = QJNIObjectPrivate::callStaticMethod<jboolean>(className, methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+template <>
+jboolean QJNIObject::callStaticMethod<jboolean>(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ ...)
+{
+ va_list args;
+ va_start(args, sig);
+ jboolean res = QJNIObjectPrivate::callStaticMethod<jboolean>(clazz, methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+template <>
+jbyte QJNIObject::callStaticMethod<jbyte>(const char *className,
+ const char *methodName,
+ const char *sig,
+ ...)
+{
+ va_list args;
+ va_start(args, sig);
+ jbyte res = QJNIObjectPrivate::callStaticMethod<jbyte>(className, methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+template <>
+jbyte QJNIObject::callStaticMethod<jbyte>(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ ...)
+{
+ va_list args;
+ va_start(args, sig);
+ jbyte res = QJNIObjectPrivate::callStaticMethod<jbyte>(clazz, methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+template <>
+jchar QJNIObject::callStaticMethod<jchar>(const char *className,
+ const char *methodName,
+ const char *sig,
+ ...)
+{
+ va_list args;
+ va_start(args, sig);
+ jchar res = QJNIObjectPrivate::callStaticMethod<jchar>(className, methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+template <>
+jchar QJNIObject::callStaticMethod<jchar>(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ ...)
+{
+ va_list args;
+ va_start(args, sig);
+ jchar res = QJNIObjectPrivate::callStaticMethod<jchar>(clazz, methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+
+template <>
+jshort QJNIObject::callStaticMethod<jshort>(const char *className,
+ const char *methodName,
+ const char *sig,
+ ...)
+{
+ va_list args;
+ va_start(args, sig);
+ jshort res = QJNIObjectPrivate::callStaticMethod<jshort>(className, methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+template <>
+jshort QJNIObject::callStaticMethod<jshort>(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ ...)
+{
+ va_list args;
+ va_start(args, sig);
+ jshort res = QJNIObjectPrivate::callStaticMethod<jshort>(clazz, methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+template <>
+jint QJNIObject::callStaticMethod<jint>(const char *className,
+ const char *methodName,
+ const char *sig,
+ ...)
+{
+ va_list args;
+ va_start(args, sig);
+ jint res = QJNIObjectPrivate::callStaticMethod<jint>(className, methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+template <>
+jint QJNIObject::callStaticMethod<jint>(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ ...)
+{
+ va_list args;
+ va_start(args, sig);
+ jint res = QJNIObjectPrivate::callStaticMethod<jint>(clazz, methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+template <>
+jlong QJNIObject::callStaticMethod<jlong>(const char *className,
+ const char *methodName,
+ const char *sig,
+ ...)
+{
+ va_list args;
+ va_start(args, sig);
+ jlong res = QJNIObjectPrivate::callStaticMethod<jlong>(className, methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+template <>
+jlong QJNIObject::callStaticMethod<jlong>(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ ...)
+{
+ va_list args;
+ va_start(args, sig);
+ jlong res = QJNIObjectPrivate::callStaticMethod<jlong>(clazz, methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+template <>
+jfloat QJNIObject::callStaticMethod<jfloat>(const char *className,
+ const char *methodName,
+ const char *sig,
+ ...)
+{
+ va_list args;
+ va_start(args, sig);
+ jfloat res = QJNIObjectPrivate::callStaticMethod<jfloat>(className, methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+template <>
+jfloat QJNIObject::callStaticMethod<jfloat>(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ ...)
+{
+ va_list args;
+ va_start(args, sig);
+ jfloat res = QJNIObjectPrivate::callStaticMethod<jfloat>(clazz, methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+template <>
+jdouble QJNIObject::callStaticMethod<jdouble>(const char *className,
+ const char *methodName,
+ const char *sig,
+ ...)
+{
+ va_list args;
+ va_start(args, sig);
+ jdouble res = QJNIObjectPrivate::callStaticMethod<jdouble>(className, methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+template <>
+jdouble QJNIObject::callStaticMethod<jdouble>(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ ...)
+{
+ va_list args;
+ va_start(args, sig);
+ jdouble res = QJNIObjectPrivate::callStaticMethod<jdouble>(clazz, methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+QJNIObject QJNIObject::callStaticObjectMethod(const char *className,
+ const char *methodName,
+ const char *sig,
+ ...)
+{
+ va_list args;
+ va_start(args, sig);
+ QJNIObjectPrivate res = QJNIObjectPrivate::callStaticObjectMethod(className,
+ methodName,
+ sig,
+ args);
+ va_end(args);
+ return res;
+}
+
+QJNIObject QJNIObject::callStaticObjectMethod(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ ...)
+{
+ va_list args;
+ va_start(args, sig);
+ QJNIObjectPrivate res = QJNIObjectPrivate::callStaticObjectMethod(clazz, methodName, sig, args);
+ va_end(args);
+ return res;
+}
+
+template <>
+void QJNIObject::callStaticMethod<void>(const char *className, const char *methodName)
+{
+ callStaticMethod<void>(className, methodName, "()V");
+}
+
+template <>
+void QJNIObject::callStaticMethod<void>(jclass clazz, const char *methodName)
+{
+ callStaticMethod<void>(clazz, methodName, "()V");
+}
+
+template <>
+jboolean QJNIObject::callStaticMethod<jboolean>(const char *className, const char *methodName)
+{
+ return callStaticMethod<jboolean>(className, methodName, "()Z");
+}
+
+template <>
+jboolean QJNIObject::callStaticMethod<jboolean>(jclass clazz, const char *methodName)
+{
+ return callStaticMethod<jboolean>(clazz, methodName, "()Z");
+}
+
+template <>
+jbyte QJNIObject::callStaticMethod<jbyte>(const char *className, const char *methodName)
+{
+ return callStaticMethod<jbyte>(className, methodName, "()B");
+}
+
+template <>
+jbyte QJNIObject::callStaticMethod<jbyte>(jclass clazz, const char *methodName)
+{
+ return callStaticMethod<jbyte>(clazz, methodName, "()B");
+}
+
+template <>
+jchar QJNIObject::callStaticMethod<jchar>(const char *className, const char *methodName)
+{
+ return callStaticMethod<jchar>(className, methodName, "()C");
+}
+
+template <>
+jchar QJNIObject::callStaticMethod<jchar>(jclass clazz, const char *methodName)
+{
+ return callStaticMethod<jchar>(clazz, methodName, "()C");
+}
+
+template <>
+jshort QJNIObject::callStaticMethod<jshort>(const char *className, const char *methodName)
+{
+ return callStaticMethod<jshort>(className, methodName, "()S");
+}
+
+template <>
+jshort QJNIObject::callStaticMethod<jshort>(jclass clazz, const char *methodName)
+{
+ return callStaticMethod<jshort>(clazz, methodName, "()S");
+}
+
+template <>
+jint QJNIObject::callStaticMethod<jint>(const char *className, const char *methodName)
+{
+ return callStaticMethod<jint>(className, methodName, "()I");
+}
+
+template <>
+jint QJNIObject::callStaticMethod<jint>(jclass clazz, const char *methodName)
+{
+ return callStaticMethod<jint>(clazz, methodName, "()I");
+}
+
+template <>
+jlong QJNIObject::callStaticMethod<jlong>(const char *className, const char *methodName)
+{
+ return callStaticMethod<jlong>(className, methodName, "()J");
+}
+
+template <>
+jlong QJNIObject::callStaticMethod<jlong>(jclass clazz, const char *methodName)
+{
+ return callStaticMethod<jlong>(clazz, methodName, "()J");
+}
+
+template <>
+jfloat QJNIObject::callStaticMethod<jfloat>(const char *className, const char *methodName)
+{
+ return callStaticMethod<jfloat>(className, methodName, "()F");
+}
+
+template <>
+jfloat QJNIObject::callStaticMethod<jfloat>(jclass clazz, const char *methodName)
+{
+ return callStaticMethod<jfloat>(clazz, methodName, "()F");
+}
+
+template <>
+jdouble QJNIObject::callStaticMethod<jdouble>(const char *className, const char *methodName)
+{
+ return callStaticMethod<jdouble>(className, methodName, "()D");
+}
+
+template <>
+jdouble QJNIObject::callStaticMethod<jdouble>(jclass clazz, const char *methodName)
+{
+ return callStaticMethod<jdouble>(clazz, methodName, "()D");
+}
+
+template <>
+QJNIObject QJNIObject::callStaticObjectMethod<jstring>(const char *className,
+ const char *methodName)
+{
+ return callStaticObjectMethod(className, methodName, "()Ljava/lang/String;");
+}
+
+template <>
+QJNIObject QJNIObject::callStaticObjectMethod<jstring>(jclass clazz,
+ const char *methodName)
+{
+ return callStaticObjectMethod(clazz, methodName, "()Ljava/lang/String;");
+}
+
+template <>
+QJNIObject QJNIObject::callStaticObjectMethod<jbooleanArray>(const char *className,
+ const char *methodName)
+{
+ return callStaticObjectMethod(className, methodName, "()[Z");
+}
+
+template <>
+QJNIObject QJNIObject::callStaticObjectMethod<jbooleanArray>(jclass clazz,
+ const char *methodName)
+{
+ return callStaticObjectMethod(clazz, methodName, "()[Z");
+}
+
+template <>
+QJNIObject QJNIObject::callStaticObjectMethod<jbyteArray>(const char *className,
+ const char *methodName)
+{
+ return callStaticObjectMethod(className, methodName, "()[B");
+}
+
+template <>
+QJNIObject QJNIObject::callStaticObjectMethod<jbyteArray>(jclass clazz,
+ const char *methodName)
+{
+ return callStaticObjectMethod(clazz, methodName, "()[B");
+}
+
+template <>
+QJNIObject QJNIObject::callStaticObjectMethod<jcharArray>(const char *className,
+ const char *methodName)
+{
+ return callStaticObjectMethod(className, methodName, "()[C");
+}
+
+template <>
+QJNIObject QJNIObject::callStaticObjectMethod<jcharArray>(jclass clazz,
+ const char *methodName)
+{
+ return callStaticObjectMethod(clazz, methodName, "()[C");
+}
+
+template <>
+QJNIObject QJNIObject::callStaticObjectMethod<jshortArray>(const char *className,
+ const char *methodName)
+{
+ return callStaticObjectMethod(className, methodName, "()[S");
+}
+
+template <>
+QJNIObject QJNIObject::callStaticObjectMethod<jshortArray>(jclass clazz,
+ const char *methodName)
+{
+ return callStaticObjectMethod(clazz, methodName, "()[S");
+}
+
+template <>
+QJNIObject QJNIObject::callStaticObjectMethod<jintArray>(const char *className,
+ const char *methodName)
+{
+ return callStaticObjectMethod(className, methodName, "()[I");
+}
+
+template <>
+QJNIObject QJNIObject::callStaticObjectMethod<jintArray>(jclass clazz,
+ const char *methodName)
+{
+ return callStaticObjectMethod(clazz, methodName, "()[I");
+}
+
+template <>
+QJNIObject QJNIObject::callStaticObjectMethod<jlongArray>(const char *className,
+ const char *methodName)
+{
+ return callStaticObjectMethod(className, methodName, "()[J");
+}
+
+template <>
+QJNIObject QJNIObject::callStaticObjectMethod<jlongArray>(jclass clazz,
+ const char *methodName)
+{
+ return callStaticObjectMethod(clazz, methodName, "()[J");
+}
+
+template <>
+QJNIObject QJNIObject::callStaticObjectMethod<jfloatArray>(const char *className,
+ const char *methodName)
+{
+ return callStaticObjectMethod(className, methodName, "()[F");
+}
+
+template <>
+QJNIObject QJNIObject::callStaticObjectMethod<jfloatArray>(jclass clazz,
+ const char *methodName)
+{
+ return callStaticObjectMethod(clazz, methodName, "()[F");
+}
+
+template <>
+QJNIObject QJNIObject::callStaticObjectMethod<jdoubleArray>(const char *className,
+ const char *methodName)
+{
+ return callStaticObjectMethod(className, methodName, "()[D");
+}
+
+template <>
+QJNIObject QJNIObject::callStaticObjectMethod<jdoubleArray>(jclass clazz,
+ const char *methodName)
+{
+ return callStaticObjectMethod(clazz, methodName, "()[D");
+}
+
+template <>
+jboolean QJNIObject::getField<jboolean>(const char *fieldName) const
+{
+ return d->getField<jboolean>(fieldName);
+}
+
+template <>
+jbyte QJNIObject::getField<jbyte>(const char *fieldName) const
+{
+ return d->getField<jbyte>(fieldName);
+}
+
+template <>
+jchar QJNIObject::getField<jchar>(const char *fieldName) const
+{
+ return d->getField<jchar>(fieldName);
+}
+
+template <>
+jshort QJNIObject::getField<jshort>(const char *fieldName) const
+{
+ return d->getField<jshort>(fieldName);
+}
+
+template <>
+jint QJNIObject::getField<jint>(const char *fieldName) const
+{
+ return d->getField<jint>(fieldName);
+}
+
+template <>
+jlong QJNIObject::getField<jlong>(const char *fieldName) const
+{
+ return d->getField<jlong>(fieldName);
+}
+
+template <>
+jfloat QJNIObject::getField<jfloat>(const char *fieldName) const
+{
+ return d->getField<jfloat>(fieldName);
+}
+
+template <>
+jdouble QJNIObject::getField<jdouble>(const char *fieldName) const
+{
+ return d->getField<jdouble>(fieldName);
+}
+
+template <>
+QJNIObject QJNIObject::getObjectField<jobject>(const char *fieldName, const char *sig) const
+{
+ return d->getObjectField(fieldName, sig);
+}
+
+template <>
+QJNIObject QJNIObject::getObjectField<jbooleanArray>(const char *fieldName) const
+{
+ return d->getObjectField(fieldName, "[Z");
+}
+
+template <>
+QJNIObject QJNIObject::getObjectField<jbyteArray>(const char *fieldName) const
+{
+ return d->getObjectField(fieldName, "[B");
+}
+
+template <>
+QJNIObject QJNIObject::getObjectField<jcharArray>(const char *fieldName) const
+{
+ return d->getObjectField(fieldName, "[C");
+}
+
+template <>
+QJNIObject QJNIObject::getObjectField<jshortArray>(const char *fieldName) const
+{
+ return d->getObjectField(fieldName, "[S");
+}
+
+template <>
+QJNIObject QJNIObject::getObjectField<jintArray>(const char *fieldName) const
+{
+ return d->getObjectField(fieldName, "[I");
+}
+
+template <>
+QJNIObject QJNIObject::getObjectField<jlongArray>(const char *fieldName) const
+{
+ return d->getObjectField(fieldName, "[J");
+}
+
+template <>
+QJNIObject QJNIObject::getObjectField<jfloatArray>(const char *fieldName) const
+{
+ return d->getObjectField(fieldName, "[F");
+}
+
+template <>
+QJNIObject QJNIObject::getObjectField<jdoubleArray>(const char *fieldName) const
+{
+ return d->getObjectField(fieldName, "[D");
+}
+
+template <>
+QJNIObject QJNIObject::getObjectField<jstring>(const char *fieldName) const
+{
+ return d->getObjectField(fieldName, "Ljava/lang/String;");
+}
+
+template <>
+QJNIObject QJNIObject::getObjectField<jobjectArray>(const char *fieldName,
+ const char *sig) const
+{
+ return d->getObjectField(fieldName, sig);
+}
+
+template <>
+void QJNIObject::setField<jboolean>(const char *fieldName, jboolean value)
+{
+ d->setField<jboolean>(fieldName, value);
+}
+
+template <>
+void QJNIObject::setField<jbyte>(const char *fieldName, jbyte value)
+{
+ d->setField<jbyte>(fieldName, value);
+}
+
+template <>
+void QJNIObject::setField<jchar>(const char *fieldName, jchar value)
+{
+ d->setField<jchar>(fieldName, value);
+}
+
+template <>
+void QJNIObject::setField<jshort>(const char *fieldName, jshort value)
+{
+ d->setField<jshort>(fieldName, value);
+}
+
+template <>
+void QJNIObject::setField<jint>(const char *fieldName, jint value)
+{
+ d->setField<jint>(fieldName, value);
+}
+
+template <>
+void QJNIObject::setField<jlong>(const char *fieldName, jlong value)
+{
+ d->setField<jlong>(fieldName, value);
+}
+
+template <>
+void QJNIObject::setField<jfloat>(const char *fieldName, jfloat value)
+{
+ d->setField<jfloat>(fieldName, value);
+}
+
+template <>
+void QJNIObject::setField<jdouble>(const char *fieldName, jdouble value)
+{
+ d->setField<jdouble>(fieldName, value);
+}
+
+template <>
+void QJNIObject::setField<jbooleanArray>(const char *fieldName, jbooleanArray value)
+{
+ d->setField<jbooleanArray>(fieldName, value);
+}
+
+template <>
+void QJNIObject::setField<jbyteArray>(const char *fieldName, jbyteArray value)
+{
+ d->setField<jbyteArray>(fieldName, value);
+}
+
+template <>
+void QJNIObject::setField<jcharArray>(const char *fieldName, jcharArray value)
+{
+ d->setField<jcharArray>(fieldName, value);
+}
+
+template <>
+void QJNIObject::setField<jshortArray>(const char *fieldName, jshortArray value)
+{
+ d->setField<jshortArray>(fieldName, value);
+}
+
+template <>
+void QJNIObject::setField<jintArray>(const char *fieldName, jintArray value)
+{
+ d->setField<jintArray>(fieldName, value);
+}
+
+template <>
+void QJNIObject::setField<jlongArray>(const char *fieldName, jlongArray value)
+{
+ d->setField<jlongArray>(fieldName, value);
+}
+
+template <>
+void QJNIObject::setField<jfloatArray>(const char *fieldName, jfloatArray value)
+{
+ d->setField<jfloatArray>(fieldName, value);
+}
+
+template <>
+void QJNIObject::setField<jdoubleArray>(const char *fieldName, jdoubleArray value)
+{
+ d->setField<jdoubleArray>(fieldName, value);
+}
+
+template <>
+void QJNIObject::setField<jstring>(const char *fieldName, jstring value)
+{
+ d->setField<jstring>(fieldName, value);
+}
+
+template <>
+void QJNIObject::setField<jobject>(const char *fieldName,
+ const char *sig,
+ jobject value)
+{
+ d->setField<jobject>(fieldName, sig, value);
+}
+
+template <>
+void QJNIObject::setField<jobjectArray>(const char *fieldName,
+ const char *sig,
+ jobjectArray value)
+{
+ d->setField<jobjectArray>(fieldName, sig, value);
+}
+
+template <>
+jboolean QJNIObject::getStaticField<jboolean>(jclass clazz, const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticField<jboolean>(clazz, fieldName);
+}
+
+template <>
+jboolean QJNIObject::getStaticField<jboolean>(const char *className, const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticField<jboolean>(className, fieldName);
+}
+
+template <>
+jbyte QJNIObject::getStaticField<jbyte>(jclass clazz, const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticField<jbyte>(clazz, fieldName);
+}
+
+template <>
+jbyte QJNIObject::getStaticField<jbyte>(const char *className, const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticField<jbyte>(className, fieldName);
+}
+
+template <>
+jchar QJNIObject::getStaticField<jchar>(jclass clazz, const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticField<jchar>(clazz, fieldName);
+}
+
+template <>
+jchar QJNIObject::getStaticField<jchar>(const char *className, const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticField<jchar>(className, fieldName);
+}
+
+template <>
+jshort QJNIObject::getStaticField<jshort>(jclass clazz, const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticField<jshort>(clazz, fieldName);
+}
+
+template <>
+jshort QJNIObject::getStaticField<jshort>(const char *className, const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticField<jshort>(className, fieldName);
+}
+
+template <>
+jint QJNIObject::getStaticField<jint>(jclass clazz, const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticField<jint>(clazz, fieldName);
+}
+
+template <>
+jint QJNIObject::getStaticField<jint>(const char *className, const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticField<jint>(className, fieldName);
+}
+
+template <>
+jlong QJNIObject::getStaticField<jlong>(jclass clazz, const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticField<jlong>(clazz, fieldName);
+}
+
+template <>
+jlong QJNIObject::getStaticField<jlong>(const char *className, const char *fieldName)
+{
+ return getStaticField<jlong>(className, fieldName);
+}
+
+template <>
+jfloat QJNIObject::getStaticField<jfloat>(jclass clazz, const char *fieldName)
+{
+ return getStaticField<jfloat>(clazz, fieldName);
+}
+
+template <>
+jfloat QJNIObject::getStaticField<jfloat>(const char *className, const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticField<jfloat>(className, fieldName);
+}
+
+template <>
+jdouble QJNIObject::getStaticField<jdouble>(jclass clazz, const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticField<jdouble>(clazz, fieldName);
+}
+
+template <>
+jdouble QJNIObject::getStaticField<jdouble>(const char *className, const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticField<jdouble>(className, fieldName);
+}
+
+template <>
+QJNIObject QJNIObject::getStaticObjectField<jobject>(jclass clazz,
+ const char *fieldName,
+ const char *sig)
+{
+ return QJNIObjectPrivate::getStaticObjectField(clazz, fieldName, sig);
+}
+
+template <>
+QJNIObject QJNIObject::getStaticObjectField<jobject>(const char *className,
+ const char *fieldName,
+ const char *sig)
+{
+ return QJNIObjectPrivate::getStaticObjectField(className, fieldName, sig);
+}
+
+template <>
+QJNIObject QJNIObject::getStaticObjectField<jstring>(jclass clazz,
+ const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticObjectField(clazz, fieldName, "Ljava/lang/String;");
+}
+
+template <>
+QJNIObject QJNIObject::getStaticObjectField<jstring>(const char *className,
+ const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticObjectField(className, fieldName, "Ljava/lang/String;");
+}
+
+template <>
+QJNIObject QJNIObject::getStaticObjectField<jbooleanArray>(jclass clazz,
+ const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticObjectField(clazz, fieldName, "[Z");
+}
+
+template <>
+QJNIObject QJNIObject::getStaticObjectField<jbooleanArray>(const char *className,
+ const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticObjectField(className, fieldName, "[Z");
+}
+
+template <>
+QJNIObject QJNIObject::getStaticObjectField<jbyteArray>(jclass clazz,
+ const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticObjectField(clazz, fieldName, "[B");
+}
+
+template <>
+QJNIObject QJNIObject::getStaticObjectField<jbyteArray>(const char *className,
+ const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticObjectField(className, fieldName, "[B");;
+}
+
+template <>
+QJNIObject QJNIObject::getStaticObjectField<jcharArray>(jclass clazz,
+ const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticObjectField(clazz, fieldName, "[C");
+}
+
+template <>
+QJNIObject QJNIObject::getStaticObjectField<jcharArray>(const char *className,
+ const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticObjectField(className, fieldName, "[C");
+}
+
+template <>
+QJNIObject QJNIObject::getStaticObjectField<jshortArray>(jclass clazz,
+ const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticObjectField(clazz, fieldName, "[S");
+}
+
+template <>
+QJNIObject QJNIObject::getStaticObjectField<jshortArray>(const char *className,
+ const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticObjectField(className, fieldName, "[S");
+}
+
+template <>
+QJNIObject QJNIObject::getStaticObjectField<jintArray>(jclass clazz,
+ const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticObjectField(clazz, fieldName, "[I");
+}
+
+template <>
+QJNIObject QJNIObject::getStaticObjectField<jintArray>(const char *className,
+ const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticObjectField(className, fieldName, "[I");
+}
+
+template <>
+QJNIObject QJNIObject::getStaticObjectField<jlongArray>(jclass clazz,
+ const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticObjectField(clazz, fieldName, "[J");
+}
+
+template <>
+QJNIObject QJNIObject::getStaticObjectField<jlongArray>(const char *className,
+ const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticObjectField(className, fieldName, "[J");
+}
+
+template <>
+QJNIObject QJNIObject::getStaticObjectField<jfloatArray>(jclass clazz,
+ const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticObjectField(clazz, fieldName, "[F");
+}
+
+template <>
+QJNIObject QJNIObject::getStaticObjectField<jfloatArray>(const char *className,
+ const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticObjectField(className, fieldName, "[F");
+}
+
+template <>
+QJNIObject QJNIObject::getStaticObjectField<jdoubleArray>(jclass clazz,
+ const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticObjectField(clazz, fieldName, "[D");
+}
+
+template <>
+QJNIObject QJNIObject::getStaticObjectField<jdoubleArray>(const char *className,
+ const char *fieldName)
+{
+ return QJNIObjectPrivate::getStaticObjectField(className, fieldName, "[D");
+}
+
+template <>
+QJNIObject QJNIObject::getStaticObjectField<jobjectArray>(jclass clazz,
+ const char *fieldName,
+ const char *sig)
+{
+ return QJNIObjectPrivate::getStaticObjectField(clazz, fieldName, sig);
+}
+
+template <>
+QJNIObject QJNIObject::getStaticObjectField<jobjectArray>(const char *className,
+ const char *fieldName,
+ const char *sig)
+{
+ return QJNIObjectPrivate::getStaticObjectField(className, fieldName, sig);
+}
+
+template <>
+void QJNIObject::setStaticField<jboolean>(jclass clazz, const char *fieldName, jboolean value)
+{
+ QJNIObjectPrivate::setStaticField<jboolean>(clazz, fieldName, value);
+}
+
+template <>
+void QJNIObject::setStaticField<jboolean>(const char *className,
+ const char *fieldName,
+ jboolean value)
+{
+ QJNIObjectPrivate::setStaticField<jboolean>(className, fieldName, value);
+}
+
+template <>
+void QJNIObject::setStaticField<jbyte>(jclass clazz, const char *fieldName, jbyte value)
+{
+ QJNIObjectPrivate::setStaticField<jbyte>(clazz, fieldName, value);
+}
+
+template <>
+void QJNIObject::setStaticField<jbyte>(const char *className,
+ const char *fieldName,
+ jbyte value)
+{
+ QJNIObjectPrivate::setStaticField<jbyte>(className, fieldName, value);
+}
+
+template <>
+void QJNIObject::setStaticField<jchar>(jclass clazz, const char *fieldName, jchar value)
+{
+ QJNIObjectPrivate::setStaticField<jchar>(clazz, fieldName, value);
+}
+
+template <>
+void QJNIObject::setStaticField<jchar>(const char *className,
+ const char *fieldName,
+ jchar value)
+{
+ QJNIObjectPrivate::setStaticField<jchar>(className, fieldName, value);
+}
+
+template <>
+void QJNIObject::setStaticField<jshort>(jclass clazz, const char *fieldName, jshort value)
+{
+ QJNIObjectPrivate::setStaticField<jshort>(clazz, fieldName, value);
+}
+
+template <>
+void QJNIObject::setStaticField<jshort>(const char *className,
+ const char *fieldName,
+ jshort value)
+{
+ QJNIObjectPrivate::setStaticField<jshort>(className, fieldName, value);
+}
+
+template <>
+void QJNIObject::setStaticField<jint>(jclass clazz, const char *fieldName, jint value)
+{
+ QJNIObjectPrivate::setStaticField<jint>(clazz, fieldName, value);
+}
+
+template <>
+void QJNIObject::setStaticField<jint>(const char *className, const char *fieldName, jint value)
+{
+ QJNIObjectPrivate::setStaticField<jint>(className, fieldName, value);
+}
+
+template <>
+void QJNIObject::setStaticField<jlong>(jclass clazz, const char *fieldName, jlong value)
+{
+ QJNIObjectPrivate::setStaticField<jlong>(clazz, fieldName, value);
+}
+
+template <>
+void QJNIObject::setStaticField<jlong>(const char *className,
+ const char *fieldName,
+ jlong value)
+{
+ QJNIObjectPrivate::setStaticField<jlong>(className, fieldName, value);
+}
+
+template <>
+void QJNIObject::setStaticField<jfloat>(jclass clazz, const char *fieldName, jfloat value)
+{
+ QJNIObjectPrivate::setStaticField<jfloat>(clazz, fieldName, value);
+}
+
+template <>
+void QJNIObject::setStaticField<jfloat>(const char *className,
+ const char *fieldName,
+ jfloat value)
+{
+ QJNIObjectPrivate::setStaticField<jfloat>(className, fieldName, value);
+}
+
+template <>
+void QJNIObject::setStaticField<jdouble>(jclass clazz, const char *fieldName, jdouble value)
+{
+ QJNIObjectPrivate::setStaticField<jdouble>(clazz, fieldName, value);
+}
+
+template <>
+void QJNIObject::setStaticField<jdouble>(const char *className,
+ const char *fieldName,
+ jdouble value)
+{
+ QJNIObjectPrivate::setStaticField<jdouble>(className, fieldName, value);
+}
+
+template <>
+void QJNIObject::setStaticField<jobject>(jclass clazz,
+ const char *fieldName,
+ const char *sig,
+ jobject value)
+{
+ QJNIObjectPrivate::setStaticField<jobject>(clazz, fieldName, sig, value);
+}
+
+template <>
+void QJNIObject::setStaticField<jobject>(const char *className,
+ const char *fieldName,
+ const char *sig,
+ jobject value)
+{
+ QJNIObjectPrivate::setStaticField<jobject>(className, fieldName, sig, value);
+}
+
+template <>
+void QJNIObject::setStaticField<jstring>(const char *className,
+ const char *fieldName,
+ jstring value)
+{
+ QJNIObjectPrivate::setStaticField<jobject>(className, fieldName, "Ljava/lang/String;", value);
+}
+
+template <>
+void QJNIObject::setStaticField<jstring>(jclass clazz, const char *fieldName, jstring value)
+{
+ QJNIObjectPrivate::setStaticField<jobject>(clazz, fieldName, "Ljava/lang/String;", value);
+}
+
+template <>
+void QJNIObject::setStaticField<jbooleanArray>(const char *className,
+ const char *fieldName,
+ jbooleanArray value)
+{
+ QJNIObjectPrivate::setStaticField<jobject>(className, fieldName, "[Z", value);
+}
+
+template <>
+void QJNIObject::setStaticField<jbooleanArray>(jclass clazz,
+ const char *fieldName,
+ jbooleanArray value)
+{
+ QJNIObjectPrivate::setStaticField<jobject>(clazz, fieldName, "[Z", value);
+}
+
+template <>
+void QJNIObject::setStaticField<jbyteArray>(const char *className,
+ const char *fieldName,
+ jbyteArray value)
+{
+ QJNIObjectPrivate::setStaticField<jobject>(className, fieldName, "[B", value);
+}
+
+template <>
+void QJNIObject::setStaticField<jbyteArray>(jclass clazz,
+ const char *fieldName,
+ jbyteArray value)
+{
+ QJNIObjectPrivate::setStaticField<jobject>(clazz, fieldName, "[B", value);
+}
+
+template <>
+void QJNIObject::setStaticField<jcharArray>(const char *className,
+ const char *fieldName,
+ jcharArray value)
+{
+ QJNIObjectPrivate::setStaticField<jobject>(className, fieldName, "[C", value);
+}
+
+template <>
+void QJNIObject::setStaticField<jcharArray>(jclass clazz,
+ const char *fieldName,
+ jcharArray value)
+{
+ QJNIObjectPrivate::setStaticField<jobject>(clazz, fieldName, "[C", value);
+}
+
+template <>
+void QJNIObject::setStaticField<jshortArray>(const char *className,
+ const char *fieldName,
+ jshortArray value)
+{
+ QJNIObjectPrivate::setStaticField<jobject>(className, fieldName, "[S", value);
+}
+
+template <>
+void QJNIObject::setStaticField<jshortArray>(jclass clazz,
+ const char *fieldName,
+ jshortArray value)
+{
+ QJNIObjectPrivate::setStaticField<jobject>(clazz, fieldName, "[S", value);
+}
+
+template <>
+void QJNIObject::setStaticField<jintArray>(const char *className,
+ const char *fieldName,
+ jintArray value)
+{
+ QJNIObjectPrivate::setStaticField<jobject>(className, fieldName, "[I", value);
+}
+
+template <>
+void QJNIObject::setStaticField<jintArray>(jclass clazz,
+ const char *fieldName,
+ jintArray value)
+{
+ QJNIObjectPrivate::setStaticField<jobject>(clazz, fieldName, "[I", value);
+}
+
+template <>
+void QJNIObject::setStaticField<jlongArray>(const char *className,
+ const char *fieldName,
+ jlongArray value)
+{
+ QJNIObjectPrivate::setStaticField<jobject>(className, fieldName, "[J", value);
+}
+
+template <>
+void QJNIObject::setStaticField<jlongArray>(jclass clazz,
+ const char *fieldName,
+ jlongArray value)
+{
+ QJNIObjectPrivate::setStaticField<jobject>(clazz, fieldName, "[J", value);
+}
+
+template <>
+void QJNIObject::setStaticField<jfloatArray>(const char *className,
+ const char *fieldName,
+ jfloatArray value)
+{
+ QJNIObjectPrivate::setStaticField<jobject>(className, fieldName, "[F", value);
+}
+
+template <>
+void QJNIObject::setStaticField<jfloatArray>(jclass clazz,
+ const char *fieldName,
+ jfloatArray value)
+{
+ QJNIObjectPrivate::setStaticField<jobject>(clazz, fieldName, "[F", value);
+}
+
+template <>
+void QJNIObject::setStaticField<jdoubleArray>(const char *className,
+ const char *fieldName,
+ jdoubleArray value)
+{
+ QJNIObjectPrivate::setStaticField<jobject>(className, fieldName, "[D", value);
+}
+
+template <>
+void QJNIObject::setStaticField<jdoubleArray>(jclass clazz,
+ const char *fieldName,
+ jdoubleArray value)
+{
+ QJNIObjectPrivate::setStaticField<jobject>(clazz, fieldName, "[D", value);
+}
+
+QJNIObject QJNIObject::fromString(const QString &string)
+{
+ return QJNIObjectPrivate::fromString(string);
+}
+
+QString QJNIObject::toString() const
+{
+ return d->toString();
+}
+
+bool QJNIObject::isClassAvailable(const char *className)
+{
+ return QJNIObjectPrivate::isClassAvailable(className);
+}
+
+bool QJNIObject::isValid() const
+{
+ return d->isValid();
+}
+
+jobject QJNIObject::javaObject() const
+{
+ return d->object();
+}
+
+bool QJNIObject::isSameObject(jobject obj) const
+{
+ return d->isSameObject(obj);
+}
+
+bool QJNIObject::isSameObject(const QJNIObject &obj) const
+{
+ return d->isSameObject(*obj.d);
+}
+
+void QJNIObject::assign(jobject o)
+{
+ if (d->isSameObject(o))
+ return;
+
+ d = QSharedPointer<QJNIObjectPrivate>(new QJNIObjectPrivate(o));
+}
+
+QT_END_NAMESPACE
diff --git a/src/androidextras/jni/qjniobject.h b/src/androidextras/jni/qjniobject.h
new file mode 100644
index 0000000..86ddea3
--- /dev/null
+++ b/src/androidextras/jni/qjniobject.h
@@ -0,0 +1,202 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QJNIOBJECT_H
+#define QJNIOBJECT_H
+
+#include <jni.h>
+#include <QtAndroidExtras/qandroidextrasglobal.h>
+#include <QtCore/qglobal.h>
+#include <QtCore/qsharedpointer.h>
+
+QT_BEGIN_NAMESPACE
+
+class QJNIObjectPrivate;
+
+class Q_ANDROIDEXTRAS_EXPORT QJNIObject
+{
+public:
+ QJNIObject();
+ explicit QJNIObject(const char *className);
+ QJNIObject(const char *className, const char *sig, ...);
+ explicit QJNIObject(jclass clazz);
+ QJNIObject(jclass clazz, const char *sig, ...);
+ QJNIObject(jobject obj);
+ ~QJNIObject() { }
+
+ template <typename T>
+ inline T object() const { return static_cast<T>(javaObject()); }
+
+ template <typename T>
+ T callMethod(const char *methodName) const;
+ template <typename T>
+ T callMethod(const char *methodName, const char *sig, ...) const;
+ template <typename T>
+ QJNIObject callObjectMethod(const char *methodName) const;
+ QJNIObject callObjectMethod(const char *methodName,
+ const char *sig,
+ ...) const;
+
+ template <typename T>
+ static T callStaticMethod(const char *className, const char *methodName);
+ template <typename T>
+ static T callStaticMethod(const char *className, const char *methodName, const char *sig, ...);
+ template <typename T>
+ static QJNIObject callStaticObjectMethod(const char *className, const char *methodName);
+ static QJNIObject callStaticObjectMethod(const char *className,
+ const char *methodName,
+ const char *sig, ...);
+ template <typename T>
+ static T callStaticMethod(jclass clazz, const char *methodName);
+ template <typename T>
+ static T callStaticMethod(jclass clazz, const char *methodName, const char *sig, ...);
+ template <typename T>
+ static QJNIObject callStaticObjectMethod(jclass clazz, const char *methodName);
+ static QJNIObject callStaticObjectMethod(jclass clazz,
+ const char *methodName,
+ const char *sig, ...);
+ template <typename T>
+ T getField(const char *fieldName) const;
+ template <typename T>
+ QJNIObject getObjectField(const char *fieldName) const;
+ template <typename T>
+ QJNIObject getObjectField(const char *fieldName, const char *sig) const;
+ template <typename T>
+ void setField(const char *fieldName, T value);
+ template <typename T>
+ void setField(const char *fieldName, const char *sig, T value);
+ template <typename T>
+ static QJNIObject getStaticObjectField(const char *className, const char *fieldName);
+ template <typename T>
+ static QJNIObject getStaticObjectField(const char *className,
+ const char *fieldName,
+ const char *sig);
+ template <typename T>
+ static T getStaticField(const char *className, const char *fieldName);
+ template <typename T>
+ static QJNIObject getStaticObjectField(jclass clazz, const char *fieldName);
+ template <typename T>
+ static QJNIObject getStaticObjectField(jclass clazz,
+ const char *fieldName,
+ const char *sig);
+ template <typename T>
+ static T getStaticField(jclass clazz, const char *fieldName);
+
+ template <typename T>
+ static void setStaticField(const char *className,
+ const char *fieldName,
+ const char *sig,
+ T value);
+ template <typename T>
+ static void setStaticField(const char *className, const char *fieldName, T value);
+ template <typename T>
+ static void setStaticField(jclass clazz, const char *fieldName, const char *sig, T value);
+ template <typename T>
+ static void setStaticField(jclass clazz, const char *fieldName, T value);
+
+ static QJNIObject fromString(const QString &string);
+ QString toString() const;
+
+ static bool isClassAvailable(const char *className);
+ bool isValid() const;
+
+ template <typename T>
+ inline QJNIObject &operator=(T o)
+ {
+ assign(static_cast<jobject>(o));
+ return *this;
+ }
+
+private:
+ friend bool operator==(const QJNIObject &, const QJNIObject &);
+ friend bool operator!=(const QJNIObject &, const QJNIObject &);
+ template <typename T> friend bool operator!=(const QJNIObject &, T);
+ template <typename T> friend bool operator==(const QJNIObject &, T);
+ template <typename T> friend bool operator!=(T, const QJNIObject &);
+ template <typename T> friend bool operator==(T, const QJNIObject &);
+
+ QJNIObject(const QJNIObjectPrivate &o);
+
+ void assign(jobject o);
+ jobject javaObject() const;
+ bool isSameObject(jobject obj) const;
+ bool isSameObject(const QJNIObject &obj) const;
+
+ QSharedPointer<QJNIObjectPrivate> d;
+};
+
+inline bool operator==(const QJNIObject &obj1, const QJNIObject &obj2)
+{
+ return obj1.isSameObject(obj2);
+}
+
+inline bool operator!=(const QJNIObject &obj1, const QJNIObject &obj2)
+{
+ return !obj1.isSameObject(obj2);
+}
+
+template <typename T>
+inline bool operator==(const QJNIObject &obj1, T obj2)
+{
+ return obj1.isSameObject(static_cast<jobject>(obj2));
+}
+
+template <typename T>
+inline bool operator==(T obj1, const QJNIObject &obj2)
+{
+ return obj2.isSameObject(static_cast<jobject>(obj1));
+}
+
+template <typename T>
+inline bool operator!=(const QJNIObject &obj1, T obj2)
+{
+ return !obj1.isSameObject(static_cast<jobject>(obj2));
+}
+
+template <typename T>
+inline bool operator!=(T obj1, const QJNIObject &obj2)
+{
+ return !obj2.isSameObject(static_cast<jobject>(obj1));
+}
+
+QT_END_NAMESPACE
+
+#endif // QJNIOBJECT_H
diff --git a/src/androidextras/qandroidextrasglobal.h b/src/androidextras/qandroidextrasglobal.h
new file mode 100644
index 0000000..77f9b4f
--- /dev/null
+++ b/src/androidextras/qandroidextrasglobal.h
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTANDROIDEXTRASGLOBAL_H
+#define QTANDROIDEXTRASGLOBAL_H
+
+#include <QtCore/qglobal.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_STATIC
+# if defined(QT_BUILD_ANDROIDEXTRAS_LIB)
+# define Q_ANDROIDEXTRAS_EXPORT Q_DECL_EXPORT
+# else
+# define Q_ANDROIDEXTRAS_EXPORT Q_DECL_IMPORT
+# endif
+#else
+# define Q_ANDROIDEXTRAS_EXPORT
+#endif
+
+QT_END_NAMESPACE
+
+#endif // QTANDROIDEXTRASGLOBAL_H
diff --git a/src/src.pro b/src/src.pro
new file mode 100644
index 0000000..c7b1e74
--- /dev/null
+++ b/src/src.pro
@@ -0,0 +1,2 @@
+TEMPLATE = subdirs
+SUBDIRS += androidextras