diff options
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r-- | src/corelib/kernel/qjni.cpp | 37 | ||||
-rw-r--r-- | src/corelib/kernel/qjni_p.h | 3 |
2 files changed, 40 insertions, 0 deletions
diff --git a/src/corelib/kernel/qjni.cpp b/src/corelib/kernel/qjni.cpp index d1113e4eae..54cd2b5a75 100644 --- a/src/corelib/kernel/qjni.cpp +++ b/src/corelib/kernel/qjni.cpp @@ -269,6 +269,24 @@ QJNIObjectPrivate::QJNIObjectPrivate(const char *className, const char *sig, ... } } +QJNIObjectPrivate::QJNIObjectPrivate(const char *className, const char *sig, va_list args) + : d(new QJNIObjectData()) +{ + QJNIEnvironmentPrivate env; + d->m_jclass = getCachedClass(env, className); + d->m_own_jclass = false; + if (d->m_jclass) { + jmethodID constructorId = getCachedMethodID(env, d->m_jclass, "<init>", sig); + if (constructorId) { + jobject obj = env->NewObjectV(d->m_jclass, constructorId, args); + if (obj) { + d->m_jobject = env->NewGlobalRef(obj); + env->DeleteLocalRef(obj); + } + } + } +} + QJNIObjectPrivate::QJNIObjectPrivate(jclass clazz) : d(new QJNIObjectData()) { @@ -309,6 +327,25 @@ QJNIObjectPrivate::QJNIObjectPrivate(jclass clazz, const char *sig, ...) } } +QJNIObjectPrivate::QJNIObjectPrivate(jclass clazz, const char *sig, va_list args) + : d(new QJNIObjectData()) +{ + QJNIEnvironmentPrivate env; + if (clazz) { + d->m_jclass = static_cast<jclass>(env->NewGlobalRef(clazz)); + if (d->m_jclass) { + jmethodID constructorId = getCachedMethodID(env, d->m_jclass, "<init>", sig); + if (constructorId) { + jobject obj = env->NewObjectV(d->m_jclass, constructorId, args); + if (obj) { + d->m_jobject = env->NewGlobalRef(obj); + env->DeleteLocalRef(obj); + } + } + } + } +} + QJNIObjectPrivate::QJNIObjectPrivate(jobject obj) : d(new QJNIObjectData()) { diff --git a/src/corelib/kernel/qjni_p.h b/src/corelib/kernel/qjni_p.h index 912b5dbee4..3f8f9ff603 100644 --- a/src/corelib/kernel/qjni_p.h +++ b/src/corelib/kernel/qjni_p.h @@ -189,6 +189,9 @@ public: private: friend class QJNIObject; + QJNIObjectPrivate(const char *className, const char *sig, va_list args); + QJNIObjectPrivate(jclass clazz, const char *sig, va_list args); + template <typename T> T callMethod(const char *methodName, const char *sig, |