summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel
diff options
context:
space:
mode:
authorChristian Strømme <christian.stromme@digia.com>2013-10-02 15:10:54 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-10-04 21:02:37 +0200
commitd519b085d18b7a2a4b4035c994def4872ca798bb (patch)
treea19d34668ef8f1fb621696669110766a96d76bd1 /src/corelib/kernel
parent5bc02ad6653252ef134f070d7e0083784e705f1e (diff)
Android: Add private ctors in QJNIObjectPrivate that takes va_list.
NewObjectV() was failing because QJNIObject was calling the variadic constructors with a va_list, which in turn created a new va_list. Change-Id: I1cf4c8133f237596964177271a20ca651174e695 Reviewed-by: Yoann Lopes <yoann.lopes@digia.com>
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r--src/corelib/kernel/qjni.cpp37
-rw-r--r--src/corelib/kernel/qjni_p.h3
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,