From e5d6abb31861f8e13b2348575e38daf0ca1511c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Str=C3=B8mme?= Date: Thu, 19 Sep 2013 12:33:56 +0200 Subject: 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 --- src/androidextras/androidextras.pro | 7 + src/androidextras/doc/qtandroidextras.qdocconf | 39 + .../code/src_androidextras_qjnienvironment.cpp | 39 + .../snippets/code/src_androidextras_qjniobject.cpp | 70 + .../doc/src/qtandroidextras-index.qdoc | 40 + .../doc/src/qtandroidextras-module.qdoc | 37 + src/androidextras/jni/jni.pri | 7 + src/androidextras/jni/qjnienvironment.cpp | 73 + src/androidextras/jni/qjnienvironment.h | 70 + src/androidextras/jni/qjniobject.cpp | 2061 ++++++++++++++++++++ src/androidextras/jni/qjniobject.h | 202 ++ src/androidextras/qandroidextrasglobal.h | 61 + src/src.pro | 2 + 13 files changed, 2708 insertions(+) create mode 100644 src/androidextras/androidextras.pro create mode 100644 src/androidextras/doc/qtandroidextras.qdocconf create mode 100644 src/androidextras/doc/snippets/code/src_androidextras_qjnienvironment.cpp create mode 100644 src/androidextras/doc/snippets/code/src_androidextras_qjniobject.cpp create mode 100644 src/androidextras/doc/src/qtandroidextras-index.qdoc create mode 100644 src/androidextras/doc/src/qtandroidextras-module.qdoc create mode 100644 src/androidextras/jni/jni.pri create mode 100644 src/androidextras/jni/qjnienvironment.cpp create mode 100644 src/androidextras/jni/qjnienvironment.h create mode 100644 src/androidextras/jni/qjniobject.cpp create mode 100644 src/androidextras/jni/qjniobject.h create mode 100644 src/androidextras/qandroidextrasglobal.h create mode 100644 src/src.pro (limited to 'src') 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("getTitles", + "()Ljava/util/List;"); + + if (list.isValid()) { + const int size = list.callMethod("size"); + for (int i = 0; i < size; ++i) { + QJNIObject title = list.callObjectMethod("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(); + } + + // 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 +#include +#include + +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 +#include +#include +#include + +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 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 +#include + +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("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("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("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(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(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("AN_INT_FIELD", 10); + jstring myString = ... + obj.setField("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(); + \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(new QJNIObjectPrivate(className, sig, args)); + va_end(args); +} + +QJNIObject::QJNIObject(jclass clazz, const char *sig, ...) +{ + va_list args; + va_start(args, sig); + d = QSharedPointer(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(const char *methodName, const char *sig, ...) const +{ + va_list args; + va_start(args, sig); + d->callMethod(methodName, sig, args); + va_end(args); +} + +template <> +jboolean QJNIObject::callMethod(const char *methodName, const char *sig, ...) const +{ + va_list args; + va_start(args, sig); + jboolean res = d->callMethod(methodName, sig, args); + va_end(args); + return res; +} + +template <> +jbyte QJNIObject::callMethod(const char *methodName, const char *sig, ...) const +{ + va_list args; + va_start(args, sig); + jbyte res = d->callMethod(methodName, sig, args); + va_end(args); + return res; +} + +template <> +jchar QJNIObject::callMethod(const char *methodName, const char *sig, ...) const +{ + va_list args; + va_start(args, sig); + jchar res = d->callMethod(methodName, sig, args); + va_end(args); + return res; +} + +template <> +jshort QJNIObject::callMethod(const char *methodName, const char *sig, ...) const +{ + va_list args; + va_start(args, sig); + jshort res = d->callMethod(methodName, sig, args); + va_end(args); + return res; +} + +template <> +jint QJNIObject::callMethod(const char *methodName, const char *sig, ...) const +{ + va_list args; + va_start(args, sig); + jint res = d->callMethod(methodName, sig, args); + va_end(args); + return res; +} + +template <> +jlong QJNIObject::callMethod(const char *methodName, const char *sig, ...) const +{ + va_list args; + va_start(args, sig); + jlong res = d->callMethod(methodName, sig, args); + va_end(args); + return res; +} + +template <> +jfloat QJNIObject::callMethod(const char *methodName, const char *sig, ...) const +{ + va_list args; + va_start(args, sig); + jfloat res = d->callMethod(methodName, sig, args); + va_end(args); + return res; +} + +template <> +jdouble QJNIObject::callMethod(const char *methodName, const char *sig, ...) const +{ + va_list args; + va_start(args, sig); + jdouble res = d->callMethod(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(const char *methodName) const +{ + callMethod(methodName, "()V"); +} + +template <> +jboolean QJNIObject::callMethod(const char *methodName) const +{ + return callMethod(methodName, "()Z"); +} + +template <> +jbyte QJNIObject::callMethod(const char *methodName) const +{ + return callMethod(methodName, "()B"); +} + +template <> +jchar QJNIObject::callMethod(const char *methodName) const +{ + return callMethod(methodName, "()C"); +} + +template <> +jshort QJNIObject::callMethod(const char *methodName) const +{ + return callMethod(methodName, "()S"); +} + +template <> +jint QJNIObject::callMethod(const char *methodName) const +{ + return callMethod(methodName, "()I"); +} + +template <> +jlong QJNIObject::callMethod(const char *methodName) const +{ + return callMethod(methodName, "()J"); +} + +template <> +jfloat QJNIObject::callMethod(const char *methodName) const +{ + return callMethod(methodName, "()F"); +} + +template <> +jdouble QJNIObject::callMethod(const char *methodName) const +{ + return callMethod(methodName, "()D"); +} + +template <> +QJNIObject QJNIObject::callObjectMethod(const char *methodName) const +{ + return d->callObjectMethod(methodName, "()Ljava/lang/String;"); +} + +template <> +QJNIObject QJNIObject::callObjectMethod(const char *methodName) const +{ + return d->callObjectMethod(methodName, "()[Z"); +} + +template <> +QJNIObject QJNIObject::callObjectMethod(const char *methodName) const +{ + return d->callObjectMethod(methodName, "()[B"); +} + +template <> +QJNIObject QJNIObject::callObjectMethod(const char *methodName) const +{ + return d->callObjectMethod(methodName, "()[S"); +} + +template <> +QJNIObject QJNIObject::callObjectMethod(const char *methodName) const +{ + return d->callObjectMethod(methodName, "()[I"); +} + +template <> +QJNIObject QJNIObject::callObjectMethod(const char *methodName) const +{ + return d->callObjectMethod(methodName, "()[J"); +} + +template <> +QJNIObject QJNIObject::callObjectMethod(const char *methodName) const +{ + return d->callObjectMethod(methodName, "()[F"); +} + +template <> +QJNIObject QJNIObject::callObjectMethod(const char *methodName) const +{ + return d->callObjectMethod(methodName, "()[D"); +} + +template <> +void QJNIObject::callStaticMethod(const char *className, + const char *methodName, + const char *sig, + ...) +{ + va_list args; + va_start(args, sig); + QJNIObjectPrivate::callStaticMethod(className, methodName, sig, args); + va_end(args); +} + +template <> +void QJNIObject::callStaticMethod(jclass clazz, + const char *methodName, + const char *sig, + ...) +{ + va_list args; + va_start(args, sig); + QJNIObjectPrivate::callStaticMethod(clazz, methodName, sig, args); + va_end(args); +} + +template <> +jboolean QJNIObject::callStaticMethod(const char *className, + const char *methodName, + const char *sig, + ...) +{ + va_list args; + va_start(args, sig); + jboolean res = QJNIObjectPrivate::callStaticMethod(className, methodName, sig, args); + va_end(args); + return res; +} + +template <> +jboolean QJNIObject::callStaticMethod(jclass clazz, + const char *methodName, + const char *sig, + ...) +{ + va_list args; + va_start(args, sig); + jboolean res = QJNIObjectPrivate::callStaticMethod(clazz, methodName, sig, args); + va_end(args); + return res; +} + +template <> +jbyte QJNIObject::callStaticMethod(const char *className, + const char *methodName, + const char *sig, + ...) +{ + va_list args; + va_start(args, sig); + jbyte res = QJNIObjectPrivate::callStaticMethod(className, methodName, sig, args); + va_end(args); + return res; +} + +template <> +jbyte QJNIObject::callStaticMethod(jclass clazz, + const char *methodName, + const char *sig, + ...) +{ + va_list args; + va_start(args, sig); + jbyte res = QJNIObjectPrivate::callStaticMethod(clazz, methodName, sig, args); + va_end(args); + return res; +} + +template <> +jchar QJNIObject::callStaticMethod(const char *className, + const char *methodName, + const char *sig, + ...) +{ + va_list args; + va_start(args, sig); + jchar res = QJNIObjectPrivate::callStaticMethod(className, methodName, sig, args); + va_end(args); + return res; +} + +template <> +jchar QJNIObject::callStaticMethod(jclass clazz, + const char *methodName, + const char *sig, + ...) +{ + va_list args; + va_start(args, sig); + jchar res = QJNIObjectPrivate::callStaticMethod(clazz, methodName, sig, args); + va_end(args); + return res; +} + + +template <> +jshort QJNIObject::callStaticMethod(const char *className, + const char *methodName, + const char *sig, + ...) +{ + va_list args; + va_start(args, sig); + jshort res = QJNIObjectPrivate::callStaticMethod(className, methodName, sig, args); + va_end(args); + return res; +} + +template <> +jshort QJNIObject::callStaticMethod(jclass clazz, + const char *methodName, + const char *sig, + ...) +{ + va_list args; + va_start(args, sig); + jshort res = QJNIObjectPrivate::callStaticMethod(clazz, methodName, sig, args); + va_end(args); + return res; +} + +template <> +jint QJNIObject::callStaticMethod(const char *className, + const char *methodName, + const char *sig, + ...) +{ + va_list args; + va_start(args, sig); + jint res = QJNIObjectPrivate::callStaticMethod(className, methodName, sig, args); + va_end(args); + return res; +} + +template <> +jint QJNIObject::callStaticMethod(jclass clazz, + const char *methodName, + const char *sig, + ...) +{ + va_list args; + va_start(args, sig); + jint res = QJNIObjectPrivate::callStaticMethod(clazz, methodName, sig, args); + va_end(args); + return res; +} + +template <> +jlong QJNIObject::callStaticMethod(const char *className, + const char *methodName, + const char *sig, + ...) +{ + va_list args; + va_start(args, sig); + jlong res = QJNIObjectPrivate::callStaticMethod(className, methodName, sig, args); + va_end(args); + return res; +} + +template <> +jlong QJNIObject::callStaticMethod(jclass clazz, + const char *methodName, + const char *sig, + ...) +{ + va_list args; + va_start(args, sig); + jlong res = QJNIObjectPrivate::callStaticMethod(clazz, methodName, sig, args); + va_end(args); + return res; +} + +template <> +jfloat QJNIObject::callStaticMethod(const char *className, + const char *methodName, + const char *sig, + ...) +{ + va_list args; + va_start(args, sig); + jfloat res = QJNIObjectPrivate::callStaticMethod(className, methodName, sig, args); + va_end(args); + return res; +} + +template <> +jfloat QJNIObject::callStaticMethod(jclass clazz, + const char *methodName, + const char *sig, + ...) +{ + va_list args; + va_start(args, sig); + jfloat res = QJNIObjectPrivate::callStaticMethod(clazz, methodName, sig, args); + va_end(args); + return res; +} + +template <> +jdouble QJNIObject::callStaticMethod(const char *className, + const char *methodName, + const char *sig, + ...) +{ + va_list args; + va_start(args, sig); + jdouble res = QJNIObjectPrivate::callStaticMethod(className, methodName, sig, args); + va_end(args); + return res; +} + +template <> +jdouble QJNIObject::callStaticMethod(jclass clazz, + const char *methodName, + const char *sig, + ...) +{ + va_list args; + va_start(args, sig); + jdouble res = QJNIObjectPrivate::callStaticMethod(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(const char *className, const char *methodName) +{ + callStaticMethod(className, methodName, "()V"); +} + +template <> +void QJNIObject::callStaticMethod(jclass clazz, const char *methodName) +{ + callStaticMethod(clazz, methodName, "()V"); +} + +template <> +jboolean QJNIObject::callStaticMethod(const char *className, const char *methodName) +{ + return callStaticMethod(className, methodName, "()Z"); +} + +template <> +jboolean QJNIObject::callStaticMethod(jclass clazz, const char *methodName) +{ + return callStaticMethod(clazz, methodName, "()Z"); +} + +template <> +jbyte QJNIObject::callStaticMethod(const char *className, const char *methodName) +{ + return callStaticMethod(className, methodName, "()B"); +} + +template <> +jbyte QJNIObject::callStaticMethod(jclass clazz, const char *methodName) +{ + return callStaticMethod(clazz, methodName, "()B"); +} + +template <> +jchar QJNIObject::callStaticMethod(const char *className, const char *methodName) +{ + return callStaticMethod(className, methodName, "()C"); +} + +template <> +jchar QJNIObject::callStaticMethod(jclass clazz, const char *methodName) +{ + return callStaticMethod(clazz, methodName, "()C"); +} + +template <> +jshort QJNIObject::callStaticMethod(const char *className, const char *methodName) +{ + return callStaticMethod(className, methodName, "()S"); +} + +template <> +jshort QJNIObject::callStaticMethod(jclass clazz, const char *methodName) +{ + return callStaticMethod(clazz, methodName, "()S"); +} + +template <> +jint QJNIObject::callStaticMethod(const char *className, const char *methodName) +{ + return callStaticMethod(className, methodName, "()I"); +} + +template <> +jint QJNIObject::callStaticMethod(jclass clazz, const char *methodName) +{ + return callStaticMethod(clazz, methodName, "()I"); +} + +template <> +jlong QJNIObject::callStaticMethod(const char *className, const char *methodName) +{ + return callStaticMethod(className, methodName, "()J"); +} + +template <> +jlong QJNIObject::callStaticMethod(jclass clazz, const char *methodName) +{ + return callStaticMethod(clazz, methodName, "()J"); +} + +template <> +jfloat QJNIObject::callStaticMethod(const char *className, const char *methodName) +{ + return callStaticMethod(className, methodName, "()F"); +} + +template <> +jfloat QJNIObject::callStaticMethod(jclass clazz, const char *methodName) +{ + return callStaticMethod(clazz, methodName, "()F"); +} + +template <> +jdouble QJNIObject::callStaticMethod(const char *className, const char *methodName) +{ + return callStaticMethod(className, methodName, "()D"); +} + +template <> +jdouble QJNIObject::callStaticMethod(jclass clazz, const char *methodName) +{ + return callStaticMethod(clazz, methodName, "()D"); +} + +template <> +QJNIObject QJNIObject::callStaticObjectMethod(const char *className, + const char *methodName) +{ + return callStaticObjectMethod(className, methodName, "()Ljava/lang/String;"); +} + +template <> +QJNIObject QJNIObject::callStaticObjectMethod(jclass clazz, + const char *methodName) +{ + return callStaticObjectMethod(clazz, methodName, "()Ljava/lang/String;"); +} + +template <> +QJNIObject QJNIObject::callStaticObjectMethod(const char *className, + const char *methodName) +{ + return callStaticObjectMethod(className, methodName, "()[Z"); +} + +template <> +QJNIObject QJNIObject::callStaticObjectMethod(jclass clazz, + const char *methodName) +{ + return callStaticObjectMethod(clazz, methodName, "()[Z"); +} + +template <> +QJNIObject QJNIObject::callStaticObjectMethod(const char *className, + const char *methodName) +{ + return callStaticObjectMethod(className, methodName, "()[B"); +} + +template <> +QJNIObject QJNIObject::callStaticObjectMethod(jclass clazz, + const char *methodName) +{ + return callStaticObjectMethod(clazz, methodName, "()[B"); +} + +template <> +QJNIObject QJNIObject::callStaticObjectMethod(const char *className, + const char *methodName) +{ + return callStaticObjectMethod(className, methodName, "()[C"); +} + +template <> +QJNIObject QJNIObject::callStaticObjectMethod(jclass clazz, + const char *methodName) +{ + return callStaticObjectMethod(clazz, methodName, "()[C"); +} + +template <> +QJNIObject QJNIObject::callStaticObjectMethod(const char *className, + const char *methodName) +{ + return callStaticObjectMethod(className, methodName, "()[S"); +} + +template <> +QJNIObject QJNIObject::callStaticObjectMethod(jclass clazz, + const char *methodName) +{ + return callStaticObjectMethod(clazz, methodName, "()[S"); +} + +template <> +QJNIObject QJNIObject::callStaticObjectMethod(const char *className, + const char *methodName) +{ + return callStaticObjectMethod(className, methodName, "()[I"); +} + +template <> +QJNIObject QJNIObject::callStaticObjectMethod(jclass clazz, + const char *methodName) +{ + return callStaticObjectMethod(clazz, methodName, "()[I"); +} + +template <> +QJNIObject QJNIObject::callStaticObjectMethod(const char *className, + const char *methodName) +{ + return callStaticObjectMethod(className, methodName, "()[J"); +} + +template <> +QJNIObject QJNIObject::callStaticObjectMethod(jclass clazz, + const char *methodName) +{ + return callStaticObjectMethod(clazz, methodName, "()[J"); +} + +template <> +QJNIObject QJNIObject::callStaticObjectMethod(const char *className, + const char *methodName) +{ + return callStaticObjectMethod(className, methodName, "()[F"); +} + +template <> +QJNIObject QJNIObject::callStaticObjectMethod(jclass clazz, + const char *methodName) +{ + return callStaticObjectMethod(clazz, methodName, "()[F"); +} + +template <> +QJNIObject QJNIObject::callStaticObjectMethod(const char *className, + const char *methodName) +{ + return callStaticObjectMethod(className, methodName, "()[D"); +} + +template <> +QJNIObject QJNIObject::callStaticObjectMethod(jclass clazz, + const char *methodName) +{ + return callStaticObjectMethod(clazz, methodName, "()[D"); +} + +template <> +jboolean QJNIObject::getField(const char *fieldName) const +{ + return d->getField(fieldName); +} + +template <> +jbyte QJNIObject::getField(const char *fieldName) const +{ + return d->getField(fieldName); +} + +template <> +jchar QJNIObject::getField(const char *fieldName) const +{ + return d->getField(fieldName); +} + +template <> +jshort QJNIObject::getField(const char *fieldName) const +{ + return d->getField(fieldName); +} + +template <> +jint QJNIObject::getField(const char *fieldName) const +{ + return d->getField(fieldName); +} + +template <> +jlong QJNIObject::getField(const char *fieldName) const +{ + return d->getField(fieldName); +} + +template <> +jfloat QJNIObject::getField(const char *fieldName) const +{ + return d->getField(fieldName); +} + +template <> +jdouble QJNIObject::getField(const char *fieldName) const +{ + return d->getField(fieldName); +} + +template <> +QJNIObject QJNIObject::getObjectField(const char *fieldName, const char *sig) const +{ + return d->getObjectField(fieldName, sig); +} + +template <> +QJNIObject QJNIObject::getObjectField(const char *fieldName) const +{ + return d->getObjectField(fieldName, "[Z"); +} + +template <> +QJNIObject QJNIObject::getObjectField(const char *fieldName) const +{ + return d->getObjectField(fieldName, "[B"); +} + +template <> +QJNIObject QJNIObject::getObjectField(const char *fieldName) const +{ + return d->getObjectField(fieldName, "[C"); +} + +template <> +QJNIObject QJNIObject::getObjectField(const char *fieldName) const +{ + return d->getObjectField(fieldName, "[S"); +} + +template <> +QJNIObject QJNIObject::getObjectField(const char *fieldName) const +{ + return d->getObjectField(fieldName, "[I"); +} + +template <> +QJNIObject QJNIObject::getObjectField(const char *fieldName) const +{ + return d->getObjectField(fieldName, "[J"); +} + +template <> +QJNIObject QJNIObject::getObjectField(const char *fieldName) const +{ + return d->getObjectField(fieldName, "[F"); +} + +template <> +QJNIObject QJNIObject::getObjectField(const char *fieldName) const +{ + return d->getObjectField(fieldName, "[D"); +} + +template <> +QJNIObject QJNIObject::getObjectField(const char *fieldName) const +{ + return d->getObjectField(fieldName, "Ljava/lang/String;"); +} + +template <> +QJNIObject QJNIObject::getObjectField(const char *fieldName, + const char *sig) const +{ + return d->getObjectField(fieldName, sig); +} + +template <> +void QJNIObject::setField(const char *fieldName, jboolean value) +{ + d->setField(fieldName, value); +} + +template <> +void QJNIObject::setField(const char *fieldName, jbyte value) +{ + d->setField(fieldName, value); +} + +template <> +void QJNIObject::setField(const char *fieldName, jchar value) +{ + d->setField(fieldName, value); +} + +template <> +void QJNIObject::setField(const char *fieldName, jshort value) +{ + d->setField(fieldName, value); +} + +template <> +void QJNIObject::setField(const char *fieldName, jint value) +{ + d->setField(fieldName, value); +} + +template <> +void QJNIObject::setField(const char *fieldName, jlong value) +{ + d->setField(fieldName, value); +} + +template <> +void QJNIObject::setField(const char *fieldName, jfloat value) +{ + d->setField(fieldName, value); +} + +template <> +void QJNIObject::setField(const char *fieldName, jdouble value) +{ + d->setField(fieldName, value); +} + +template <> +void QJNIObject::setField(const char *fieldName, jbooleanArray value) +{ + d->setField(fieldName, value); +} + +template <> +void QJNIObject::setField(const char *fieldName, jbyteArray value) +{ + d->setField(fieldName, value); +} + +template <> +void QJNIObject::setField(const char *fieldName, jcharArray value) +{ + d->setField(fieldName, value); +} + +template <> +void QJNIObject::setField(const char *fieldName, jshortArray value) +{ + d->setField(fieldName, value); +} + +template <> +void QJNIObject::setField(const char *fieldName, jintArray value) +{ + d->setField(fieldName, value); +} + +template <> +void QJNIObject::setField(const char *fieldName, jlongArray value) +{ + d->setField(fieldName, value); +} + +template <> +void QJNIObject::setField(const char *fieldName, jfloatArray value) +{ + d->setField(fieldName, value); +} + +template <> +void QJNIObject::setField(const char *fieldName, jdoubleArray value) +{ + d->setField(fieldName, value); +} + +template <> +void QJNIObject::setField(const char *fieldName, jstring value) +{ + d->setField(fieldName, value); +} + +template <> +void QJNIObject::setField(const char *fieldName, + const char *sig, + jobject value) +{ + d->setField(fieldName, sig, value); +} + +template <> +void QJNIObject::setField(const char *fieldName, + const char *sig, + jobjectArray value) +{ + d->setField(fieldName, sig, value); +} + +template <> +jboolean QJNIObject::getStaticField(jclass clazz, const char *fieldName) +{ + return QJNIObjectPrivate::getStaticField(clazz, fieldName); +} + +template <> +jboolean QJNIObject::getStaticField(const char *className, const char *fieldName) +{ + return QJNIObjectPrivate::getStaticField(className, fieldName); +} + +template <> +jbyte QJNIObject::getStaticField(jclass clazz, const char *fieldName) +{ + return QJNIObjectPrivate::getStaticField(clazz, fieldName); +} + +template <> +jbyte QJNIObject::getStaticField(const char *className, const char *fieldName) +{ + return QJNIObjectPrivate::getStaticField(className, fieldName); +} + +template <> +jchar QJNIObject::getStaticField(jclass clazz, const char *fieldName) +{ + return QJNIObjectPrivate::getStaticField(clazz, fieldName); +} + +template <> +jchar QJNIObject::getStaticField(const char *className, const char *fieldName) +{ + return QJNIObjectPrivate::getStaticField(className, fieldName); +} + +template <> +jshort QJNIObject::getStaticField(jclass clazz, const char *fieldName) +{ + return QJNIObjectPrivate::getStaticField(clazz, fieldName); +} + +template <> +jshort QJNIObject::getStaticField(const char *className, const char *fieldName) +{ + return QJNIObjectPrivate::getStaticField(className, fieldName); +} + +template <> +jint QJNIObject::getStaticField(jclass clazz, const char *fieldName) +{ + return QJNIObjectPrivate::getStaticField(clazz, fieldName); +} + +template <> +jint QJNIObject::getStaticField(const char *className, const char *fieldName) +{ + return QJNIObjectPrivate::getStaticField(className, fieldName); +} + +template <> +jlong QJNIObject::getStaticField(jclass clazz, const char *fieldName) +{ + return QJNIObjectPrivate::getStaticField(clazz, fieldName); +} + +template <> +jlong QJNIObject::getStaticField(const char *className, const char *fieldName) +{ + return getStaticField(className, fieldName); +} + +template <> +jfloat QJNIObject::getStaticField(jclass clazz, const char *fieldName) +{ + return getStaticField(clazz, fieldName); +} + +template <> +jfloat QJNIObject::getStaticField(const char *className, const char *fieldName) +{ + return QJNIObjectPrivate::getStaticField(className, fieldName); +} + +template <> +jdouble QJNIObject::getStaticField(jclass clazz, const char *fieldName) +{ + return QJNIObjectPrivate::getStaticField(clazz, fieldName); +} + +template <> +jdouble QJNIObject::getStaticField(const char *className, const char *fieldName) +{ + return QJNIObjectPrivate::getStaticField(className, fieldName); +} + +template <> +QJNIObject QJNIObject::getStaticObjectField(jclass clazz, + const char *fieldName, + const char *sig) +{ + return QJNIObjectPrivate::getStaticObjectField(clazz, fieldName, sig); +} + +template <> +QJNIObject QJNIObject::getStaticObjectField(const char *className, + const char *fieldName, + const char *sig) +{ + return QJNIObjectPrivate::getStaticObjectField(className, fieldName, sig); +} + +template <> +QJNIObject QJNIObject::getStaticObjectField(jclass clazz, + const char *fieldName) +{ + return QJNIObjectPrivate::getStaticObjectField(clazz, fieldName, "Ljava/lang/String;"); +} + +template <> +QJNIObject QJNIObject::getStaticObjectField(const char *className, + const char *fieldName) +{ + return QJNIObjectPrivate::getStaticObjectField(className, fieldName, "Ljava/lang/String;"); +} + +template <> +QJNIObject QJNIObject::getStaticObjectField(jclass clazz, + const char *fieldName) +{ + return QJNIObjectPrivate::getStaticObjectField(clazz, fieldName, "[Z"); +} + +template <> +QJNIObject QJNIObject::getStaticObjectField(const char *className, + const char *fieldName) +{ + return QJNIObjectPrivate::getStaticObjectField(className, fieldName, "[Z"); +} + +template <> +QJNIObject QJNIObject::getStaticObjectField(jclass clazz, + const char *fieldName) +{ + return QJNIObjectPrivate::getStaticObjectField(clazz, fieldName, "[B"); +} + +template <> +QJNIObject QJNIObject::getStaticObjectField(const char *className, + const char *fieldName) +{ + return QJNIObjectPrivate::getStaticObjectField(className, fieldName, "[B");; +} + +template <> +QJNIObject QJNIObject::getStaticObjectField(jclass clazz, + const char *fieldName) +{ + return QJNIObjectPrivate::getStaticObjectField(clazz, fieldName, "[C"); +} + +template <> +QJNIObject QJNIObject::getStaticObjectField(const char *className, + const char *fieldName) +{ + return QJNIObjectPrivate::getStaticObjectField(className, fieldName, "[C"); +} + +template <> +QJNIObject QJNIObject::getStaticObjectField(jclass clazz, + const char *fieldName) +{ + return QJNIObjectPrivate::getStaticObjectField(clazz, fieldName, "[S"); +} + +template <> +QJNIObject QJNIObject::getStaticObjectField(const char *className, + const char *fieldName) +{ + return QJNIObjectPrivate::getStaticObjectField(className, fieldName, "[S"); +} + +template <> +QJNIObject QJNIObject::getStaticObjectField(jclass clazz, + const char *fieldName) +{ + return QJNIObjectPrivate::getStaticObjectField(clazz, fieldName, "[I"); +} + +template <> +QJNIObject QJNIObject::getStaticObjectField(const char *className, + const char *fieldName) +{ + return QJNIObjectPrivate::getStaticObjectField(className, fieldName, "[I"); +} + +template <> +QJNIObject QJNIObject::getStaticObjectField(jclass clazz, + const char *fieldName) +{ + return QJNIObjectPrivate::getStaticObjectField(clazz, fieldName, "[J"); +} + +template <> +QJNIObject QJNIObject::getStaticObjectField(const char *className, + const char *fieldName) +{ + return QJNIObjectPrivate::getStaticObjectField(className, fieldName, "[J"); +} + +template <> +QJNIObject QJNIObject::getStaticObjectField(jclass clazz, + const char *fieldName) +{ + return QJNIObjectPrivate::getStaticObjectField(clazz, fieldName, "[F"); +} + +template <> +QJNIObject QJNIObject::getStaticObjectField(const char *className, + const char *fieldName) +{ + return QJNIObjectPrivate::getStaticObjectField(className, fieldName, "[F"); +} + +template <> +QJNIObject QJNIObject::getStaticObjectField(jclass clazz, + const char *fieldName) +{ + return QJNIObjectPrivate::getStaticObjectField(clazz, fieldName, "[D"); +} + +template <> +QJNIObject QJNIObject::getStaticObjectField(const char *className, + const char *fieldName) +{ + return QJNIObjectPrivate::getStaticObjectField(className, fieldName, "[D"); +} + +template <> +QJNIObject QJNIObject::getStaticObjectField(jclass clazz, + const char *fieldName, + const char *sig) +{ + return QJNIObjectPrivate::getStaticObjectField(clazz, fieldName, sig); +} + +template <> +QJNIObject QJNIObject::getStaticObjectField(const char *className, + const char *fieldName, + const char *sig) +{ + return QJNIObjectPrivate::getStaticObjectField(className, fieldName, sig); +} + +template <> +void QJNIObject::setStaticField(jclass clazz, const char *fieldName, jboolean value) +{ + QJNIObjectPrivate::setStaticField(clazz, fieldName, value); +} + +template <> +void QJNIObject::setStaticField(const char *className, + const char *fieldName, + jboolean value) +{ + QJNIObjectPrivate::setStaticField(className, fieldName, value); +} + +template <> +void QJNIObject::setStaticField(jclass clazz, const char *fieldName, jbyte value) +{ + QJNIObjectPrivate::setStaticField(clazz, fieldName, value); +} + +template <> +void QJNIObject::setStaticField(const char *className, + const char *fieldName, + jbyte value) +{ + QJNIObjectPrivate::setStaticField(className, fieldName, value); +} + +template <> +void QJNIObject::setStaticField(jclass clazz, const char *fieldName, jchar value) +{ + QJNIObjectPrivate::setStaticField(clazz, fieldName, value); +} + +template <> +void QJNIObject::setStaticField(const char *className, + const char *fieldName, + jchar value) +{ + QJNIObjectPrivate::setStaticField(className, fieldName, value); +} + +template <> +void QJNIObject::setStaticField(jclass clazz, const char *fieldName, jshort value) +{ + QJNIObjectPrivate::setStaticField(clazz, fieldName, value); +} + +template <> +void QJNIObject::setStaticField(const char *className, + const char *fieldName, + jshort value) +{ + QJNIObjectPrivate::setStaticField(className, fieldName, value); +} + +template <> +void QJNIObject::setStaticField(jclass clazz, const char *fieldName, jint value) +{ + QJNIObjectPrivate::setStaticField(clazz, fieldName, value); +} + +template <> +void QJNIObject::setStaticField(const char *className, const char *fieldName, jint value) +{ + QJNIObjectPrivate::setStaticField(className, fieldName, value); +} + +template <> +void QJNIObject::setStaticField(jclass clazz, const char *fieldName, jlong value) +{ + QJNIObjectPrivate::setStaticField(clazz, fieldName, value); +} + +template <> +void QJNIObject::setStaticField(const char *className, + const char *fieldName, + jlong value) +{ + QJNIObjectPrivate::setStaticField(className, fieldName, value); +} + +template <> +void QJNIObject::setStaticField(jclass clazz, const char *fieldName, jfloat value) +{ + QJNIObjectPrivate::setStaticField(clazz, fieldName, value); +} + +template <> +void QJNIObject::setStaticField(const char *className, + const char *fieldName, + jfloat value) +{ + QJNIObjectPrivate::setStaticField(className, fieldName, value); +} + +template <> +void QJNIObject::setStaticField(jclass clazz, const char *fieldName, jdouble value) +{ + QJNIObjectPrivate::setStaticField(clazz, fieldName, value); +} + +template <> +void QJNIObject::setStaticField(const char *className, + const char *fieldName, + jdouble value) +{ + QJNIObjectPrivate::setStaticField(className, fieldName, value); +} + +template <> +void QJNIObject::setStaticField(jclass clazz, + const char *fieldName, + const char *sig, + jobject value) +{ + QJNIObjectPrivate::setStaticField(clazz, fieldName, sig, value); +} + +template <> +void QJNIObject::setStaticField(const char *className, + const char *fieldName, + const char *sig, + jobject value) +{ + QJNIObjectPrivate::setStaticField(className, fieldName, sig, value); +} + +template <> +void QJNIObject::setStaticField(const char *className, + const char *fieldName, + jstring value) +{ + QJNIObjectPrivate::setStaticField(className, fieldName, "Ljava/lang/String;", value); +} + +template <> +void QJNIObject::setStaticField(jclass clazz, const char *fieldName, jstring value) +{ + QJNIObjectPrivate::setStaticField(clazz, fieldName, "Ljava/lang/String;", value); +} + +template <> +void QJNIObject::setStaticField(const char *className, + const char *fieldName, + jbooleanArray value) +{ + QJNIObjectPrivate::setStaticField(className, fieldName, "[Z", value); +} + +template <> +void QJNIObject::setStaticField(jclass clazz, + const char *fieldName, + jbooleanArray value) +{ + QJNIObjectPrivate::setStaticField(clazz, fieldName, "[Z", value); +} + +template <> +void QJNIObject::setStaticField(const char *className, + const char *fieldName, + jbyteArray value) +{ + QJNIObjectPrivate::setStaticField(className, fieldName, "[B", value); +} + +template <> +void QJNIObject::setStaticField(jclass clazz, + const char *fieldName, + jbyteArray value) +{ + QJNIObjectPrivate::setStaticField(clazz, fieldName, "[B", value); +} + +template <> +void QJNIObject::setStaticField(const char *className, + const char *fieldName, + jcharArray value) +{ + QJNIObjectPrivate::setStaticField(className, fieldName, "[C", value); +} + +template <> +void QJNIObject::setStaticField(jclass clazz, + const char *fieldName, + jcharArray value) +{ + QJNIObjectPrivate::setStaticField(clazz, fieldName, "[C", value); +} + +template <> +void QJNIObject::setStaticField(const char *className, + const char *fieldName, + jshortArray value) +{ + QJNIObjectPrivate::setStaticField(className, fieldName, "[S", value); +} + +template <> +void QJNIObject::setStaticField(jclass clazz, + const char *fieldName, + jshortArray value) +{ + QJNIObjectPrivate::setStaticField(clazz, fieldName, "[S", value); +} + +template <> +void QJNIObject::setStaticField(const char *className, + const char *fieldName, + jintArray value) +{ + QJNIObjectPrivate::setStaticField(className, fieldName, "[I", value); +} + +template <> +void QJNIObject::setStaticField(jclass clazz, + const char *fieldName, + jintArray value) +{ + QJNIObjectPrivate::setStaticField(clazz, fieldName, "[I", value); +} + +template <> +void QJNIObject::setStaticField(const char *className, + const char *fieldName, + jlongArray value) +{ + QJNIObjectPrivate::setStaticField(className, fieldName, "[J", value); +} + +template <> +void QJNIObject::setStaticField(jclass clazz, + const char *fieldName, + jlongArray value) +{ + QJNIObjectPrivate::setStaticField(clazz, fieldName, "[J", value); +} + +template <> +void QJNIObject::setStaticField(const char *className, + const char *fieldName, + jfloatArray value) +{ + QJNIObjectPrivate::setStaticField(className, fieldName, "[F", value); +} + +template <> +void QJNIObject::setStaticField(jclass clazz, + const char *fieldName, + jfloatArray value) +{ + QJNIObjectPrivate::setStaticField(clazz, fieldName, "[F", value); +} + +template <> +void QJNIObject::setStaticField(const char *className, + const char *fieldName, + jdoubleArray value) +{ + QJNIObjectPrivate::setStaticField(className, fieldName, "[D", value); +} + +template <> +void QJNIObject::setStaticField(jclass clazz, + const char *fieldName, + jdoubleArray value) +{ + QJNIObjectPrivate::setStaticField(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(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 +#include +#include +#include + +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 + inline T object() const { return static_cast(javaObject()); } + + template + T callMethod(const char *methodName) const; + template + T callMethod(const char *methodName, const char *sig, ...) const; + template + QJNIObject callObjectMethod(const char *methodName) const; + QJNIObject callObjectMethod(const char *methodName, + const char *sig, + ...) const; + + template + static T callStaticMethod(const char *className, const char *methodName); + template + static T callStaticMethod(const char *className, const char *methodName, const char *sig, ...); + template + static QJNIObject callStaticObjectMethod(const char *className, const char *methodName); + static QJNIObject callStaticObjectMethod(const char *className, + const char *methodName, + const char *sig, ...); + template + static T callStaticMethod(jclass clazz, const char *methodName); + template + static T callStaticMethod(jclass clazz, const char *methodName, const char *sig, ...); + template + static QJNIObject callStaticObjectMethod(jclass clazz, const char *methodName); + static QJNIObject callStaticObjectMethod(jclass clazz, + const char *methodName, + const char *sig, ...); + template + T getField(const char *fieldName) const; + template + QJNIObject getObjectField(const char *fieldName) const; + template + QJNIObject getObjectField(const char *fieldName, const char *sig) const; + template + void setField(const char *fieldName, T value); + template + void setField(const char *fieldName, const char *sig, T value); + template + static QJNIObject getStaticObjectField(const char *className, const char *fieldName); + template + static QJNIObject getStaticObjectField(const char *className, + const char *fieldName, + const char *sig); + template + static T getStaticField(const char *className, const char *fieldName); + template + static QJNIObject getStaticObjectField(jclass clazz, const char *fieldName); + template + static QJNIObject getStaticObjectField(jclass clazz, + const char *fieldName, + const char *sig); + template + static T getStaticField(jclass clazz, const char *fieldName); + + template + static void setStaticField(const char *className, + const char *fieldName, + const char *sig, + T value); + template + static void setStaticField(const char *className, const char *fieldName, T value); + template + static void setStaticField(jclass clazz, const char *fieldName, const char *sig, T value); + template + 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 + inline QJNIObject &operator=(T o) + { + assign(static_cast(o)); + return *this; + } + +private: + friend bool operator==(const QJNIObject &, const QJNIObject &); + friend bool operator!=(const QJNIObject &, const QJNIObject &); + template friend bool operator!=(const QJNIObject &, T); + template friend bool operator==(const QJNIObject &, T); + template friend bool operator!=(T, const QJNIObject &); + template 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 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 +inline bool operator==(const QJNIObject &obj1, T obj2) +{ + return obj1.isSameObject(static_cast(obj2)); +} + +template +inline bool operator==(T obj1, const QJNIObject &obj2) +{ + return obj2.isSameObject(static_cast(obj1)); +} + +template +inline bool operator!=(const QJNIObject &obj1, T obj2) +{ + return !obj1.isSameObject(static_cast(obj2)); +} + +template +inline bool operator!=(T obj1, const QJNIObject &obj2) +{ + return !obj2.isSameObject(static_cast(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 + +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 -- cgit v1.2.3