diff --git a/README.md b/README
similarity index 94%
rename from README.md
rename to README
index ffdce66f..8077ca02 100644
--- a/README.md
+++ b/README
@@ -115,7 +115,7 @@ to your project:
$VERSION
```
-(exchange `$VERSION` either by `5.15.15` or by `6.5.1`).
+(exchange `$VERSION` either by `5.15.16` or by `6.5.2`).
Otherwise, download QtJambi JAR file from [Maven Central Repository](https://search.maven.org/artifact/io.qtjambi/qtjambi/).
@@ -135,7 +135,7 @@ public class Test {
Compile the file:
``` powershell
-javac -cp qtjambi-6.5.1.jar Test.java
+javac -cp qtjambi-6.5.2.jar Test.java
```
### Execute Example
@@ -154,19 +154,19 @@ In case your Linux distribution provides Qt (of correct version) as system libra
The example program can be executed this way on Windows:
``` powershell
-java -cp qtjambi-6.5.1.jar;. -Djava.library.path=C:\Qt\6.5.1\msvc2019_64\bin Test
+java -cp qtjambi-6.5.2.jar;. -Djava.library.path=C:\Qt\6.5.1\msvc2019_64\bin Test
```
On Linux it looks this way:
``` bash
-java -cp qtjambi-6.5.1.jar:. -Djava.library.path=/Qt/6.5.1/gcc_64/lib Test
+java -cp qtjambi-6.5.2.jar:. -Djava.library.path=/Qt/6.5.1/gcc_64/lib Test
```
On macOS you additionally need to use the start parameter -XstartOnFirstThread:
``` bash
-java -cp qtjambi-6.5.1.jar:. -Djava.library.path=/Qt/6.5.1/macos/lib -XstartOnFirstThread Test
+java -cp qtjambi-6.5.2.jar:. -Djava.library.path=/Qt/6.5.1/macos/lib -XstartOnFirstThread Test
```
In general, you can start learning how to use Qt in Java [as it is introduced for C++](https://doc.qt.io/qt-6/gettingstarted.html#create-your-first-applications).
diff --git a/antfiles/autotests.xml b/antfiles/autotests.xml
index 8c9a3b7a..5775ce74 100644
--- a/antfiles/autotests.xml
+++ b/antfiles/autotests.xml
@@ -70,6 +70,7 @@
+
@@ -132,6 +133,7 @@
+
diff --git a/antfiles/generator.xml b/antfiles/generator.xml
index 8d4261c9..f74b4654 100644
--- a/antfiles/generator.xml
+++ b/antfiles/generator.xml
@@ -6,6 +6,24 @@
+
+
+
+
+
+
-
+
- ${deploymentdir}/qt-lib-core-native-${qtjambi.osname}${platformjar.debug.suffix}-${qtjambi.version.bundle}.jar not available.
+ ${deploymentdir}/native/qt-lib-core-native-${qtjambi.osname}${platformjar.debug.suffix}-${qtjambi.version.bundle}.jar not available.
@@ -350,7 +350,7 @@
-
+
@@ -362,7 +362,8 @@
-
+
+
diff --git a/releases.properties b/releases.properties
index f18b9a6b..53c4cc59 100644
--- a/releases.properties
+++ b/releases.properties
@@ -1,7 +1,8 @@
-5.15=15
+5.15=16
6.0=2
6.1=2
6.2=13
6.3=7
6.4=5
-6.5=1
\ No newline at end of file
+6.5=2
+6.6=0
\ No newline at end of file
diff --git a/src/cpp/QtJambi/cast.cpp b/src/cpp/QtJambi/cast.cpp
index 2d6b3148..7465de00 100644
--- a/src/cpp/QtJambi/cast.cpp
+++ b/src/cpp/QtJambi/cast.cpp
@@ -260,16 +260,16 @@ void test(JNIEnv *env){
{
InternalToExternalConverter c1;
InternalToExternalConverter c2 = c1;
- InternalToExternalConverter c3 = [](JNIEnv*, QtJambiScope*, const void*, jvalue*, bool)->bool{return false;};
- InternalToExternalConverter c4([](JNIEnv*, QtJambiScope*, const void*, jvalue*, bool)->bool{return false;});
- InternalToExternalConverter c5(InternalToExternalConverter([](JNIEnv*, QtJambiScope*, const void*, jvalue*, bool)->bool{return false;}));
+ InternalToExternalConverter c3 = [](JNIEnv*, QtJambiScope*, const void*, jvalue&, bool)->bool{return false;};
+ InternalToExternalConverter c4([](JNIEnv*, QtJambiScope*, const void*, jvalue&, bool)->bool{return false;});
+ InternalToExternalConverter c5(InternalToExternalConverter([](JNIEnv*, QtJambiScope*, const void*, jvalue&, bool)->bool{return false;}));
}
{
ExternalToInternalConverter c1;
ExternalToInternalConverter c2 = c1;
- ExternalToInternalConverter c3 = [](JNIEnv*, QtJambiScope*, const jvalue&, void* &, jValueType)->bool{return false;};
- ExternalToInternalConverter c4([](JNIEnv*, QtJambiScope*, const jvalue&, void* &, jValueType)->bool{return false;});
- ExternalToInternalConverter c5(ExternalToInternalConverter([](JNIEnv*, QtJambiScope*, const jvalue&, void* &, jValueType)->bool{return false;}));
+ ExternalToInternalConverter c3 = [](JNIEnv*, QtJambiScope*, jvalue, void* &, jValueType)->bool{return false;};
+ ExternalToInternalConverter c4([](JNIEnv*, QtJambiScope*, jvalue, void* &, jValueType)->bool{return false;});
+ ExternalToInternalConverter c5(ExternalToInternalConverter([](JNIEnv*, QtJambiScope*, jvalue, void* &, jValueType)->bool{return false;}));
}
{
QStringList l;
diff --git a/src/cpp/QtJambi/configure.pri b/src/cpp/QtJambi/configure.pri
index 79ea44df..58331301 100644
--- a/src/cpp/QtJambi/configure.pri
+++ b/src/cpp/QtJambi/configure.pri
@@ -38,6 +38,8 @@ VER_MAJ = $$section(VERSION, ., 0, 0)
VER_MIN = $$section(VERSION, ., 1, 1)
VER_PAT = $$section(VERSION, ., 2, 2)
+DEFINES += QT_DISABLE_DEPRECATED_UP_TO=0x050000
+
isEmpty(QTJAMBI_PROJECT):{
QTJAMBI_PROJECT = $$TARGET
}
diff --git a/src/cpp/QtJambi/containeraccess.cpp b/src/cpp/QtJambi/containeraccess.cpp
index 43c40c52..9e9115df 100644
--- a/src/cpp/QtJambi/containeraccess.cpp
+++ b/src/cpp/QtJambi/containeraccess.cpp
@@ -2334,10 +2334,10 @@ AbstractContainerAccess* createPreparedContainerAccess(JNIEnv* env, SequentialCo
#endif
isPointer,
hashFunction,
- [](JNIEnv*, QtJambiScope*, const void*, jvalue*, bool)->bool{
+ [](JNIEnv*, QtJambiScope*, const void*, jvalue&, bool)->bool{
return false;
},
- [](JNIEnv*, QtJambiScope*, const jvalue&, void* &, jValueType) -> bool{
+ [](JNIEnv*, QtJambiScope*, jvalue, void* &, jValueType) -> bool{
return false;
});
}
@@ -2391,10 +2391,10 @@ AbstractContainerAccess* createPreparedContainerAccess(JNIEnv* env, AssociativeC
align1, size1,
isPointer1,
hashFunction1,
- [](JNIEnv*, QtJambiScope*, const void*, jvalue*, bool)->bool{
+ [](JNIEnv*, QtJambiScope*, const void*, jvalue&, bool)->bool{
return false;
},
- [](JNIEnv*, QtJambiScope*, const jvalue&, void* &, jValueType) -> bool{
+ [](JNIEnv*, QtJambiScope*, jvalue, void* &, jValueType) -> bool{
return false;
},
isPointer2 && !memberMetaType2.isValid() ? voidPtr : memberMetaType2,
@@ -2402,10 +2402,10 @@ AbstractContainerAccess* createPreparedContainerAccess(JNIEnv* env, AssociativeC
size2,
isPointer2,
hashFunction2,
- [](JNIEnv*, QtJambiScope*, const void*, jvalue*, bool)->bool{
+ [](JNIEnv*, QtJambiScope*, const void*, jvalue&, bool)->bool{
return false;
},
- [](JNIEnv*, QtJambiScope*, const jvalue&, void* &, jValueType) -> bool{
+ [](JNIEnv*, QtJambiScope*, jvalue, void* &, jValueType) -> bool{
return false;
});
return containerAccess;
diff --git a/src/cpp/QtJambi/containeraccess.h b/src/cpp/QtJambi/containeraccess.h
index 9d93ae85..0efe386c 100644
--- a/src/cpp/QtJambi/containeraccess.h
+++ b/src/cpp/QtJambi/containeraccess.h
@@ -459,7 +459,7 @@ class SequentialConstIteratorAccess : public AbstractSequentialConstIteratorAcce
jvalue _value;
_value.l = nullptr;
QTJAMBI_ELEMENT_LOCKER
- bool success = m_internalToExternalConverter(env, nullptr, &(*(*iter)), &_value, true);
+ bool success = m_internalToExternalConverter(env, nullptr, &(*(*iter)), _value, true);
if(success){
return _value.l;
}
@@ -588,7 +588,7 @@ class AssociativeConstIteratorAccess : public AbstractAssociativeConstIteratorAc
jvalue _value;
_value.l = nullptr;
QTJAMBI_KEY_VALUE_LOCKER
- bool success = m_valueInternalToExternalConverter(env, nullptr, &(iter->value()), &_value, true);
+ bool success = m_valueInternalToExternalConverter(env, nullptr, &(iter->value()), _value, true);
if(success){
return _value.l;
}
@@ -600,7 +600,7 @@ class AssociativeConstIteratorAccess : public AbstractAssociativeConstIteratorAc
jvalue _value;
_value.l = nullptr;
QTJAMBI_KEY_VALUE_LOCKER
- bool success = m_keyInternalToExternalConverter(env, nullptr, &(iter->key()), &_value, true);
+ bool success = m_keyInternalToExternalConverter(env, nullptr, &(iter->key()), _value, true);
if(success){
return _value.l;
}
diff --git a/src/cpp/QtJambi/containeraccess_hash.cpp b/src/cpp/QtJambi/containeraccess_hash.cpp
index aeb6e4d7..625d8e3f 100644
--- a/src/cpp/QtJambi/containeraccess_hash.cpp
+++ b/src/cpp/QtJambi/containeraccess_hash.cpp
@@ -619,7 +619,7 @@ jobject AutoHashAccess::nodeKey(JNIEnv * env, Node* node)
jvalue jv;
jv.l = nullptr;
if(node)
- m_keyInternalToExternalConverter(env, nullptr, reinterpret_cast(node)+m_offset1, &jv, true);
+ m_keyInternalToExternalConverter(env, nullptr, reinterpret_cast(node)+m_offset1, jv, true);
return jv.l;
}
@@ -628,7 +628,7 @@ jobject AutoHashAccess::nodeValue(JNIEnv * env, Node* node)
jvalue jv;
jv.l = nullptr;
if(node)
- m_valueInternalToExternalConverter(env, nullptr, reinterpret_cast(node)+m_offset2, &jv, true);
+ m_valueInternalToExternalConverter(env, nullptr, reinterpret_cast(node)+m_offset2, jv, true);
return jv.l;
}
@@ -1349,7 +1349,7 @@ jobject AutoHashAccess::find(JNIEnv * env, QtJambiNativeID ownerId, void* contai
QtJambiScope scope;
void* akey = nullptr;
if(m_keyExternalToInternalConverter(env, &scope, jv, akey, jValueType::l)){
- auto it = d->find(*this, key);
+ auto it = d->find(*this, akey);
if (it.isUnused())
it = d->end(*this);
return createIterator(env, ownerId, new iterator(it));
@@ -1383,7 +1383,7 @@ jobject AutoHashAccess::constFind(JNIEnv * env, QtJambiNativeID ownerId, const v
QtJambiScope scope;
void* akey = nullptr;
if(m_keyExternalToInternalConverter(env, &scope, jv, akey, jValueType::l)){
- auto it = d->find(*this, key);
+ auto it = d->find(*this, akey);
if (it.isUnused())
it = d->end(*this);
return createConstIterator(env, ownerId, new iterator(it));
@@ -1419,7 +1419,7 @@ jobject AutoHashAccess::key(JNIEnv *env, const void* container, jobject value, j
if (m_valueMetaType.equals(i.value(), value)){
jvalue jv;
jv.l = nullptr;
- m_keyInternalToExternalConverter(env, nullptr, i.key(), &jv, true);
+ m_keyInternalToExternalConverter(env, nullptr, i.key(), jv, true);
return jv.l;
}
++i;
@@ -1449,7 +1449,7 @@ jobject AutoHashAccess::value(JNIEnv *env, const void* container, jobject key, j
if (!iter.isUnused()){
jvalue jv;
jv.l = nullptr;
- m_valueInternalToExternalConverter(env, nullptr, iterator(iter).value(), &jv, true);
+ m_valueInternalToExternalConverter(env, nullptr, iterator(iter).value(), jv, true);
return jv.l;
}
#endif
@@ -2207,7 +2207,7 @@ jobject AutoHashAccess::keys(JNIEnv *env, const void* container)
while (n != e) {
jvalue jv;
jv.l = nullptr;
- m_keyInternalToExternalConverter(env, nullptr, n.key(), &jv, true);
+ m_keyInternalToExternalConverter(env, nullptr, n.key(), jv, true);
listAccess->insert(env, listContainer, idx++, 1, jv.l);
++n;
}
@@ -2267,7 +2267,7 @@ jobject AutoHashAccess::keys(JNIEnv *env, const void* container, jobject value)
if(m_valueMetaType.equals(n.value(), _qvaluePtr)){
jvalue jv;
jv.l = nullptr;
- m_keyInternalToExternalConverter(env, nullptr, n.key(), &jv, true);
+ m_keyInternalToExternalConverter(env, nullptr, n.key(), jv, true);
listAccess->insert(env, listContainer, idx++, 1, jv.l);
}
++n;
@@ -2350,7 +2350,7 @@ jobject AutoHashAccess::take(JNIEnv *env, void* container, jobject key)
if (!it.isUnused()){
jvalue jv;
jv.l = nullptr;
- m_valueInternalToExternalConverter(env, nullptr, it.value(), &jv, true);
+ m_valueInternalToExternalConverter(env, nullptr, it.value(), jv, true);
d->erase(*this, it);
return jv.l;
}
@@ -2400,7 +2400,7 @@ jobject AutoHashAccess::values(JNIEnv *env, const void* container)
while (n != e) {
jvalue jv;
jv.l = nullptr;
- m_valueInternalToExternalConverter(env, nullptr, n.value(), &jv, true);
+ m_valueInternalToExternalConverter(env, nullptr, n.value(), jv, true);
listAccess->insert(env, listContainer, idx++, 1, jv.l);
++n;
}
diff --git a/src/cpp/QtJambi/containeraccess_hash.h b/src/cpp/QtJambi/containeraccess_hash.h
index de4fe9f8..deea8cc1 100644
--- a/src/cpp/QtJambi/containeraccess_hash.h
+++ b/src/cpp/QtJambi/containeraccess_hash.h
@@ -333,7 +333,7 @@ class GenericHashAccess : public AbstractHashAccess{
if(m_valueExternalToInternalConverter(env, nullptr, jv, _qvaluePtr, jValueType::l)){
K _qkey = reinterpret_cast *>(container)->key(_qvalue, _qdefaultkey);
jv.l = nullptr;
- if(m_keyInternalToExternalConverter(env, nullptr, &_qkey, &jv, true)){
+ if(m_keyInternalToExternalConverter(env, nullptr, &_qkey, jv, true)){
result = jv.l;
}
}
@@ -470,7 +470,7 @@ class GenericHashAccess : public AbstractHashAccess{
T _qvalue = reinterpret_cast *>(container)->take(_qkey);
jvalue _value;
_value.l = nullptr;
- if(m_valueInternalToExternalConverter(env, nullptr, &_qvalue, &_value, true)){
+ if(m_valueInternalToExternalConverter(env, nullptr, &_qvalue, _value, true)){
result = _value.l;
}
}
@@ -493,7 +493,7 @@ class GenericHashAccess : public AbstractHashAccess{
if(m_valueExternalToInternalConverter(env, nullptr, jv, _qdefaultValuePtr, jValueType::l)){
T _qvalue = reinterpret_cast *>(container)->value(_qkey, _qdefaultValue);
jv.l = nullptr;
- if(m_valueInternalToExternalConverter(env, nullptr, &_qvalue, &jv, true)){
+ if(m_valueInternalToExternalConverter(env, nullptr, &_qvalue, jv, true)){
result = jv.l;
}
}
diff --git a/src/cpp/QtJambi/containeraccess_iterator.cpp b/src/cpp/QtJambi/containeraccess_iterator.cpp
index faca5b19..f143d165 100644
--- a/src/cpp/QtJambi/containeraccess_iterator.cpp
+++ b/src/cpp/QtJambi/containeraccess_iterator.cpp
@@ -44,7 +44,7 @@ jobject AutoSequentialConstIteratorAccess::value(JNIEnv * env, const void* itera
const void* v = m_value(iterator);
jvalue jval;
jval.l = nullptr;
- if(m_internalToExternalConverter(env, nullptr, v, &jval, true))
+ if(m_internalToExternalConverter(env, nullptr, v, jval, true))
return jval.l;
return nullptr;
}
@@ -117,7 +117,7 @@ jobject AutoAssociativeConstIteratorAccess::key(JNIEnv * env, const void* iterat
const void* v = m_key(iterator);
jvalue jval;
jval.l = nullptr;
- if(m_keyInternalToExternalConverter(env, nullptr, v, &jval, true))
+ if(m_keyInternalToExternalConverter(env, nullptr, v, jval, true))
return jval.l;
return nullptr;
}
diff --git a/src/cpp/QtJambi/containeraccess_linkedlist.cpp b/src/cpp/QtJambi/containeraccess_linkedlist.cpp
index bb14bdea..ee356aba 100644
--- a/src/cpp/QtJambi/containeraccess_linkedlist.cpp
+++ b/src/cpp/QtJambi/containeraccess_linkedlist.cpp
@@ -502,7 +502,7 @@ jobject AutoLinkedListAccess::first(JNIEnv * env, const void* container)
Q_ASSERT(d->size>0);
jvalue _value;
_value.l = nullptr;
- if(m_internalToExternalConverter(env, nullptr, &reinterpret_cast(d)->n->t, &_value, true))
+ if(m_internalToExternalConverter(env, nullptr, &reinterpret_cast(d)->n->t, _value, true))
return _value.l;
return nullptr;
}
@@ -514,7 +514,7 @@ jobject AutoLinkedListAccess::last(JNIEnv * env, const void* container)
Q_ASSERT(d->size>0);
jvalue _value;
_value.l = nullptr;
- if(m_internalToExternalConverter(env, nullptr, &reinterpret_cast(d)->p->t, &_value, true))
+ if(m_internalToExternalConverter(env, nullptr, &reinterpret_cast(d)->p->t, _value, true))
return _value.l;
return nullptr;
}
diff --git a/src/cpp/QtJambi/containeraccess_linkedlist.h b/src/cpp/QtJambi/containeraccess_linkedlist.h
index 70922721..869bfef3 100644
--- a/src/cpp/QtJambi/containeraccess_linkedlist.h
+++ b/src/cpp/QtJambi/containeraccess_linkedlist.h
@@ -179,7 +179,7 @@ class GenericLinkedListAccess : public AbstractLinkedListAccess{
const T& result = reinterpret_cast *>(container)->first();
jvalue _value;
_value.l = nullptr;
- if(m_internalToExternalConverter(env, nullptr, &result, &_value, true)){
+ if(m_internalToExternalConverter(env, nullptr, &result, _value, true)){
return _value.l;
}
return nullptr;
@@ -192,7 +192,7 @@ class GenericLinkedListAccess : public AbstractLinkedListAccess{
QTJAMBI_ELEMENT_LOCKER
{
T qresult = reinterpret_cast *>(container)->last();
- success = m_internalToExternalConverter(env, nullptr, &qresult, &_result, true);
+ success = m_internalToExternalConverter(env, nullptr, &qresult, _result, true);
}
if(success){
return _result.l;
@@ -207,7 +207,7 @@ class GenericLinkedListAccess : public AbstractLinkedListAccess{
QTJAMBI_ELEMENT_LOCKER
{
T result = reinterpret_cast *>(container)->takeFirst();
- success = m_internalToExternalConverter(env, nullptr, &result, &_value, true);
+ success = m_internalToExternalConverter(env, nullptr, &result, _value, true);
}
if(success){
return _value.l;
@@ -222,7 +222,7 @@ class GenericLinkedListAccess : public AbstractLinkedListAccess{
QTJAMBI_ELEMENT_LOCKER
{
T result = reinterpret_cast *>(container)->takeLast();
- success = m_internalToExternalConverter(env, nullptr, &result, &_value, true);
+ success = m_internalToExternalConverter(env, nullptr, &result, _value, true);
}
if(success){
return _value.l;
diff --git a/src/cpp/QtJambi/containeraccess_list.cpp b/src/cpp/QtJambi/containeraccess_list.cpp
index f3e2aafc..0ef403d8 100644
--- a/src/cpp/QtJambi/containeraccess_list.cpp
+++ b/src/cpp/QtJambi/containeraccess_list.cpp
@@ -1061,6 +1061,7 @@ void AutoListAccess::appendList(JNIEnv * env, void* container, jobject list)
}else{
jobject iter = QtJambiAPI::iteratorOfJavaCollection(env, list);
jint idx = size(env, container);
+ reserve(env, container, idx + QtJambiAPI::sizeOfJavaCollection(env, list));
while(QtJambiAPI::hasJavaIteratorNext(env, iter)){
insert(env, container, idx++, 1, QtJambiAPI::nextOfJavaIterator(env, iter));
}
@@ -1076,11 +1077,11 @@ jobject AutoListAccess::at(JNIEnv * env, const void* container, jint index)
Q_ASSERT_X(index >= 0 && index < p->size(), "QList::at", "index out of range");
void** v = p->at(index);
if(m_isLargeOrStaticType){
- if(m_internalToExternalConverter(env, nullptr, reinterpret_cast(v)->v, &_value, true)){
+ if(m_internalToExternalConverter(env, nullptr, reinterpret_cast(v)->v, _value, true)){
return _value.l;
}
}else{
- if(m_internalToExternalConverter(env, nullptr, v, &_value, true)){
+ if(m_internalToExternalConverter(env, nullptr, v, _value, true)){
return _value.l;
}
}
@@ -1088,7 +1089,7 @@ jobject AutoListAccess::at(JNIEnv * env, const void* container, jint index)
const QArrayDataPointer* p = reinterpret_cast*>(container);
Q_ASSERT_X(index >= 0 && index < p->size, "QList::at", "index out of range");
void* ptr = p->ptr+index*m_offset;
- if(m_internalToExternalConverter(env, nullptr, ptr, &_value, true)){
+ if(m_internalToExternalConverter(env, nullptr, ptr, _value, true)){
return _value.l;
}
#endif
@@ -1104,11 +1105,11 @@ jobject AutoListAccess::value(JNIEnv * env, const void* container, jint index)
if(index >= 0 && index < p->size()){
void** v = p->at(index);
if(m_isLargeOrStaticType){
- if(m_internalToExternalConverter(env, nullptr, reinterpret_cast(v)->v, &_value, true)){
+ if(m_internalToExternalConverter(env, nullptr, reinterpret_cast(v)->v, _value, true)){
return _value.l;
}
}else{
- if(m_internalToExternalConverter(env, nullptr, v, &_value, true)){
+ if(m_internalToExternalConverter(env, nullptr, v, _value, true)){
return _value.l;
}
}
@@ -1116,13 +1117,13 @@ jobject AutoListAccess::value(JNIEnv * env, const void* container, jint index)
const QArrayDataPointer* p = reinterpret_cast*>(container);
if(index >= 0 && index < p->size){
void* ptr = p->ptr+index*m_offset;
- if(m_internalToExternalConverter(env, nullptr, ptr, &_value, true)){
+ if(m_internalToExternalConverter(env, nullptr, ptr, _value, true)){
return _value.l;
}
#endif
}else{
void* ptr = m_elementMetaType.create();
- bool success = m_internalToExternalConverter(env, nullptr, ptr, &_value, true);
+ bool success = m_internalToExternalConverter(env, nullptr, ptr, _value, true);
m_elementMetaType.destroy(ptr);
if(success)
return _value.l;
@@ -1139,11 +1140,11 @@ jobject AutoListAccess::value(JNIEnv * env, const void* container, jint index, j
if(index >= 0 && index < p->size()){
void** v = p->at(index);
if(m_isLargeOrStaticType){
- if(m_internalToExternalConverter(env, nullptr, reinterpret_cast(v)->v, &_value, true)){
+ if(m_internalToExternalConverter(env, nullptr, reinterpret_cast(v)->v, _value, true)){
return _value.l;
}
}else{
- if(m_internalToExternalConverter(env, nullptr, v, &_value, true)){
+ if(m_internalToExternalConverter(env, nullptr, v, _value, true)){
return _value.l;
}
}
@@ -1151,7 +1152,7 @@ jobject AutoListAccess::value(JNIEnv * env, const void* container, jint index, j
const QArrayDataPointer* p = reinterpret_cast*>(container);
if(index >= 0 && index < p->size){
void* ptr = p->ptr+index*m_offset;
- if(m_internalToExternalConverter(env, nullptr, ptr, &_value, true)){
+ if(m_internalToExternalConverter(env, nullptr, ptr, _value, true)){
return _value.l;
}
#endif
diff --git a/src/cpp/QtJambi/containeraccess_list.h b/src/cpp/QtJambi/containeraccess_list.h
index 69129036..58e5039d 100644
--- a/src/cpp/QtJambi/containeraccess_list.h
+++ b/src/cpp/QtJambi/containeraccess_list.h
@@ -187,7 +187,7 @@ class GenericListAccess : public AbstractListAccess{
jvalue _value;
_value.l = nullptr;
- if(m_internalToExternalConverter(env, nullptr, &result, &_value, true)){
+ if(m_internalToExternalConverter(env, nullptr, &result, _value, true)){
return _value.l;
}
return nullptr;
@@ -201,7 +201,7 @@ class GenericListAccess : public AbstractListAccess{
QTJAMBI_ELEMENT_LOCKER
{
T qresult = reinterpret_cast *>(container)->value(index);
- success = m_internalToExternalConverter(env, nullptr, &qresult, &_result, true);
+ success = m_internalToExternalConverter(env, nullptr, &qresult, _result, true);
}
if(success){
@@ -223,7 +223,7 @@ class GenericListAccess : public AbstractListAccess{
_defaultValue.l = defaultValue;
if(m_externalToInternalConverter(env, nullptr, _defaultValue, _qdefaultValuePtr, jValueType::l)){
T qresult = reinterpret_cast *>(container)->value(index, _qdefaultValue);
- success = m_internalToExternalConverter(env, nullptr, &qresult, &_result, true);
+ success = m_internalToExternalConverter(env, nullptr, &qresult, _result, true);
}
}
diff --git a/src/cpp/QtJambi/containeraccess_map.cpp b/src/cpp/QtJambi/containeraccess_map.cpp
index a79ec9e0..e4c33aa9 100644
--- a/src/cpp/QtJambi/containeraccess_map.cpp
+++ b/src/cpp/QtJambi/containeraccess_map.cpp
@@ -1330,7 +1330,7 @@ jobject AutoMapAccess::nodeKey(JNIEnv * env, Node* node)
jvalue jv;
jv.l = nullptr;
if(node)
- m_keyInternalToExternalConverter(env, nullptr, reinterpret_cast(node)+m_offset1, &jv, true);
+ m_keyInternalToExternalConverter(env, nullptr, reinterpret_cast(node)+m_offset1, jv, true);
return jv.l;
}
@@ -1339,7 +1339,7 @@ jobject AutoMapAccess::nodeValue(JNIEnv * env, Node* node)
jvalue jv;
jv.l = nullptr;
if(node)
- m_valueInternalToExternalConverter(env, nullptr, reinterpret_cast(node)+m_offset2, &jv, true);
+ m_valueInternalToExternalConverter(env, nullptr, reinterpret_cast(node)+m_offset2, jv, true);
return jv.l;
}
diff --git a/src/cpp/QtJambi/containeraccess_map.h b/src/cpp/QtJambi/containeraccess_map.h
index cad64a3e..d5d8db63 100644
--- a/src/cpp/QtJambi/containeraccess_map.h
+++ b/src/cpp/QtJambi/containeraccess_map.h
@@ -308,7 +308,7 @@ class GenericMapAccess : public AbstractMapAccess{
const T& first = reinterpret_cast *>(container)->first();
jvalue _value;
_value.l = nullptr;
- if(m_valueInternalToExternalConverter(env, nullptr, &first, &_value, true)){
+ if(m_valueInternalToExternalConverter(env, nullptr, &first, _value, true)){
result = _value.l;
}
}
@@ -322,7 +322,7 @@ class GenericMapAccess : public AbstractMapAccess{
const K& firstKey = reinterpret_cast *>(container)->firstKey();
jvalue _value;
_value.l = nullptr;
- if(m_keyInternalToExternalConverter(env, nullptr, &firstKey, &_value, true)){
+ if(m_keyInternalToExternalConverter(env, nullptr, &firstKey, _value, true)){
result = _value.l;
}
}
@@ -363,7 +363,7 @@ class GenericMapAccess : public AbstractMapAccess{
if(m_valueExternalToInternalConverter(env, nullptr, jv, _qvaluePtr, jValueType::l)){
K _qkey = reinterpret_cast *>(container)->key(_qvalue, _qdefaultkey);
jv.l = nullptr;
- if(m_keyInternalToExternalConverter(env, nullptr, &_qkey, &jv, true)){
+ if(m_keyInternalToExternalConverter(env, nullptr, &_qkey, jv, true)){
result = jv.l;
}
}
@@ -432,7 +432,7 @@ class GenericMapAccess : public AbstractMapAccess{
const T& last = reinterpret_cast *>(container)->last();
jvalue _value;
_value.l = nullptr;
- if(m_valueInternalToExternalConverter(env, nullptr, &last, &_value, true)){
+ if(m_valueInternalToExternalConverter(env, nullptr, &last, _value, true)){
result = _value.l;
}
}
@@ -446,7 +446,7 @@ class GenericMapAccess : public AbstractMapAccess{
const K& lastKey = reinterpret_cast *>(container)->lastKey();
jvalue _value;
_value.l = nullptr;
- if(m_keyInternalToExternalConverter(env, nullptr, &lastKey, &_value, true)){
+ if(m_keyInternalToExternalConverter(env, nullptr, &lastKey, _value, true)){
result = _value.l;
}
}
@@ -543,7 +543,7 @@ class GenericMapAccess : public AbstractMapAccess{
T _qvalue = reinterpret_cast *>(container)->take(_qkey);
jvalue _value;
_value.l = nullptr;
- if(m_valueInternalToExternalConverter(env, nullptr, &_qvalue, &_value, true)){
+ if(m_valueInternalToExternalConverter(env, nullptr, &_qvalue, _value, true)){
result = _value.l;
}
}
@@ -591,7 +591,7 @@ class GenericMapAccess : public AbstractMapAccess{
if(m_valueExternalToInternalConverter(env, nullptr, jv, _qdefaultValuePtr, jValueType::l)){
T _qvalue = reinterpret_cast *>(container)->value(_qkey, _qdefaultValue);
jv.l = nullptr;
- if(m_valueInternalToExternalConverter(env, nullptr, &_qvalue, &jv, true)){
+ if(m_valueInternalToExternalConverter(env, nullptr, &_qvalue, jv, true)){
result = jv.l;
}
}
diff --git a/src/cpp/QtJambi/containeraccess_multihash.cpp b/src/cpp/QtJambi/containeraccess_multihash.cpp
index 1cf96de8..8f160b8c 100644
--- a/src/cpp/QtJambi/containeraccess_multihash.cpp
+++ b/src/cpp/QtJambi/containeraccess_multihash.cpp
@@ -270,7 +270,7 @@ jobject AutoMultiHashAccess::uniqueKeys(JNIEnv *env, const void* container)
while (n != e) {
jvalue jv;
jv.l = nullptr;
- m_keyInternalToExternalConverter(env, nullptr, n.key(), &jv, true);
+ m_keyInternalToExternalConverter(env, nullptr, n.key(), jv, true);
listAccess->insert(env, listContainer, idx++, 1, jv.l);
++n;
}
@@ -377,14 +377,14 @@ jobject AutoMultiHashAccess::values(JNIEnv *env, const void* container, jobject
}
#else
iterator i = d->find(*this, akey);
- if(i.e){
+ if(i.e && !i.i.isUnused()){
multi_iterator& it = reinterpret_cast(i);
const Chain* chain = *it.e;
jint idx = listAccess->size(env, listContainer);
while(chain){
jvalue jv;
jv.l = nullptr;
- m_valueInternalToExternalConverter(env, nullptr, chain->value(), &jv, true);
+ m_valueInternalToExternalConverter(env, nullptr, chain->value(), jv, true);
listAccess->insert(env, listContainer, idx++, 1, jv.l);
chain = chain->next(*this);
}
@@ -419,7 +419,7 @@ jboolean AutoMultiHashAccess::contains(JNIEnv *env, const void* container, jobje
}
#else
iterator i = d->find(*this, akey);
- if(i.e){
+ if(i.e && !i.i.isUnused()){
jv.l = value;
void* avalue = nullptr;
if(m_valueExternalToInternalConverter(env, &scope, jv, avalue, jValueType::l)){
@@ -463,7 +463,7 @@ jint AutoMultiHashAccess::count(JNIEnv *env, const void* container, jobject key,
}
#else
iterator i = d->find(*this, akey);
- if(i.e){
+ if(i.e && !i.i.isUnused()){
jv.l = value;
void* avalue = nullptr;
if(m_valueExternalToInternalConverter(env, &scope, jv, avalue, jValueType::l)){
@@ -607,7 +607,7 @@ jint AutoMultiHashAccess::remove(JNIEnv *env, void* container, jobject key, jobj
}while(found);
#else
iterator i = d->find(*this, akey);
- if(i.e){
+ if(i.e && !i.i.isUnused()){
jv.l = value;
void* avalue = nullptr;
if(m_valueExternalToInternalConverter(env, &scope, jv, avalue, jValueType::l)){
diff --git a/src/cpp/QtJambi/containeraccess_multihash.h b/src/cpp/QtJambi/containeraccess_multihash.h
index 1cd744eb..da427f7f 100644
--- a/src/cpp/QtJambi/containeraccess_multihash.h
+++ b/src/cpp/QtJambi/containeraccess_multihash.h
@@ -215,7 +215,7 @@ class GenericMultiHashAccess : public AbstractMultiHashAccess{
if(m_valueExternalToInternalConverter(env, nullptr, jv, _qvaluePtr, jValueType::l)){
K _qkey = reinterpret_cast *>(container)->key(_qvalue, _qdefaultkey);
jv.l = nullptr;
- if(m_keyInternalToExternalConverter(env, nullptr, &_qkey, &jv, true)){
+ if(m_keyInternalToExternalConverter(env, nullptr, &_qkey, jv, true)){
result = jv.l;
}
}
@@ -372,7 +372,7 @@ class GenericMultiHashAccess : public AbstractMultiHashAccess{
T _qvalue = reinterpret_cast *>(container)->take(_qkey);
jvalue _value;
_value.l = nullptr;
- if(m_valueInternalToExternalConverter(env, nullptr, &_qvalue, &_value, true)){
+ if(m_valueInternalToExternalConverter(env, nullptr, &_qvalue, _value, true)){
result = _value.l;
}
}
@@ -395,7 +395,7 @@ class GenericMultiHashAccess : public AbstractMultiHashAccess{
if(m_valueExternalToInternalConverter(env, nullptr, jv, _qdefaultValuePtr, jValueType::l)){
T _qvalue = reinterpret_cast *>(container)->value(_qkey, _qdefaultValue);
jv.l = nullptr;
- if(m_valueInternalToExternalConverter(env, nullptr, &_qvalue, &jv, true)){
+ if(m_valueInternalToExternalConverter(env, nullptr, &_qvalue, jv, true)){
result = jv.l;
}
}
diff --git a/src/cpp/QtJambi/containeraccess_multimap.h b/src/cpp/QtJambi/containeraccess_multimap.h
index b965a00d..2e6f8a54 100644
--- a/src/cpp/QtJambi/containeraccess_multimap.h
+++ b/src/cpp/QtJambi/containeraccess_multimap.h
@@ -189,7 +189,7 @@ class GenericMultiMapAccess : public AbstractMultiMapAccess{
const T& first = reinterpret_cast *>(container)->first();
jvalue _value;
_value.l = nullptr;
- if(m_valueInternalToExternalConverter(env, nullptr, &first, &_value, true)){
+ if(m_valueInternalToExternalConverter(env, nullptr, &first, _value, true)){
result = _value.l;
}
}
@@ -203,7 +203,7 @@ class GenericMultiMapAccess : public AbstractMultiMapAccess{
const K& firstKey = reinterpret_cast *>(container)->firstKey();
jvalue _value;
_value.l = nullptr;
- if(m_keyInternalToExternalConverter(env, nullptr, &firstKey, &_value, true)){
+ if(m_keyInternalToExternalConverter(env, nullptr, &firstKey, _value, true)){
result = _value.l;
}
}
@@ -244,7 +244,7 @@ class GenericMultiMapAccess : public AbstractMultiMapAccess{
if(m_valueExternalToInternalConverter(env, nullptr, jv, _qvaluePtr, jValueType::l)){
K _qkey = reinterpret_cast *>(container)->key(_qvalue, _qdefaultkey);
jv.l = nullptr;
- if(m_keyInternalToExternalConverter(env, nullptr, &_qkey, &jv, true)){
+ if(m_keyInternalToExternalConverter(env, nullptr, &_qkey, jv, true)){
result = jv.l;
}
}
@@ -315,7 +315,7 @@ class GenericMultiMapAccess : public AbstractMultiMapAccess{
const T& last = reinterpret_cast *>(container)->last();
jvalue _value;
_value.l = nullptr;
- if(m_valueInternalToExternalConverter(env, nullptr, &last, &_value, true)){
+ if(m_valueInternalToExternalConverter(env, nullptr, &last, _value, true)){
result = _value.l;
}
}
@@ -329,7 +329,7 @@ class GenericMultiMapAccess : public AbstractMultiMapAccess{
const K& lastKey = reinterpret_cast *>(container)->lastKey();
jvalue _value;
_value.l = nullptr;
- if(m_keyInternalToExternalConverter(env, nullptr, &lastKey, &_value, true)){
+ if(m_keyInternalToExternalConverter(env, nullptr, &lastKey, _value, true)){
result = _value.l;
}
}
@@ -426,7 +426,7 @@ class GenericMultiMapAccess : public AbstractMultiMapAccess{
T _qvalue = reinterpret_cast *>(container)->take(_qkey);
jvalue _value;
_value.l = nullptr;
- if(m_valueInternalToExternalConverter(env, nullptr, &_qvalue, &_value, true)){
+ if(m_valueInternalToExternalConverter(env, nullptr, &_qvalue, _value, true)){
result = _value.l;
}
}
@@ -474,7 +474,7 @@ class GenericMultiMapAccess : public AbstractMultiMapAccess{
if(m_valueExternalToInternalConverter(env, nullptr, jv, _qdefaultValuePtr, jValueType::l)){
T _qvalue = reinterpret_cast *>(container)->value(_qkey, _qdefaultValue);
jv.l = nullptr;
- if(m_valueInternalToExternalConverter(env, nullptr, &_qvalue, &jv, true)){
+ if(m_valueInternalToExternalConverter(env, nullptr, &_qvalue, jv, true)){
result = jv.l;
}
}
diff --git a/src/cpp/QtJambi/containeraccess_pair.cpp b/src/cpp/QtJambi/containeraccess_pair.cpp
index bcdd038c..0ec5ddfd 100644
--- a/src/cpp/QtJambi/containeraccess_pair.cpp
+++ b/src/cpp/QtJambi/containeraccess_pair.cpp
@@ -616,7 +616,7 @@ jobject AutoPairAccess::first(JNIEnv * env, const void* container) {
{
jvalue _first;
_first.l = nullptr;
- if(m_keyInternalToExternalConverter(env, nullptr, container, &_first, true)){
+ if(m_keyInternalToExternalConverter(env, nullptr, container, _first, true)){
result = _first.l;
}
}
@@ -635,7 +635,7 @@ jobject AutoPairAccess::second(JNIEnv * env, const void* container) {
{
jvalue _value;
_value.l = nullptr;
- if(m_valueInternalToExternalConverter(env, nullptr, snd, &_value, true)){
+ if(m_valueInternalToExternalConverter(env, nullptr, snd, _value, true)){
result = _value.l;
}
}
diff --git a/src/cpp/QtJambi/containeraccess_pair.h b/src/cpp/QtJambi/containeraccess_pair.h
index a228fcba..f1de4a98 100644
--- a/src/cpp/QtJambi/containeraccess_pair.h
+++ b/src/cpp/QtJambi/containeraccess_pair.h
@@ -141,7 +141,7 @@ class GenericPairAccess : public AbstractPairAccess{
{
jvalue _first;
_first.l = nullptr;
- if(m_keyInternalToExternalConverter(env, nullptr, &reinterpret_cast *>(container)->first, &_first, true)){
+ if(m_keyInternalToExternalConverter(env, nullptr, &reinterpret_cast *>(container)->first, _first, true)){
result = _first.l;
}
}
@@ -164,7 +164,7 @@ class GenericPairAccess : public AbstractPairAccess{
{
jvalue _value;
_value.l = nullptr;
- if(m_valueInternalToExternalConverter(env, nullptr, &reinterpret_cast *>(container)->second, &_value, true)){
+ if(m_valueInternalToExternalConverter(env, nullptr, &reinterpret_cast *>(container)->second, _value, true)){
result = _value.l;
}
}
diff --git a/src/cpp/QtJambi/containeraccess_vector.cpp b/src/cpp/QtJambi/containeraccess_vector.cpp
index 894db35b..26786976 100644
--- a/src/cpp/QtJambi/containeraccess_vector.cpp
+++ b/src/cpp/QtJambi/containeraccess_vector.cpp
@@ -524,6 +524,7 @@ void AutoVectorAccess::appendVector(JNIEnv * env, void* container, jobject list)
}else{
QTypedArrayData ** vector = reinterpret_cast **>(container);
jobject iter = QtJambiAPI::iteratorOfJavaCollection(env, list);
+ reserve(env, container, jint((*vector)->size + QtJambiAPI::sizeOfJavaCollection(env, list)));
while(QtJambiAPI::hasJavaIteratorNext(env, iter)){
insert(env, container, (*vector)->size, 1, QtJambiAPI::nextOfJavaIterator(env, iter));
}
@@ -539,7 +540,7 @@ jobject AutoVectorAccess::at(JNIEnv * env, const void* container, jint index)
Q_ASSERT_X(index >= 0 && index < d->size, "QVector::at", "index out of range");
char* data = d->data();
void* v = data + index*m_offset;
- if(m_internalToExternalConverter(env, nullptr, v, &_value, true)){
+ if(m_internalToExternalConverter(env, nullptr, v, _value, true)){
return _value.l;
}
return nullptr;
@@ -554,12 +555,12 @@ jobject AutoVectorAccess::value(JNIEnv * env, const void* container, jint index)
if(index >= 0 && index < d->size){
char* data = d->data();
void* v = data + index*m_offset;
- if(m_internalToExternalConverter(env, nullptr, v, &_value, true)){
+ if(m_internalToExternalConverter(env, nullptr, v, _value, true)){
return _value.l;
}
}else{
void* ptr = m_elementMetaType.create();
- bool success = m_internalToExternalConverter(env, nullptr, ptr, &_value, true);
+ bool success = m_internalToExternalConverter(env, nullptr, ptr, _value, true);
m_elementMetaType.destroy(ptr);
if(success)
return _value.l;
@@ -576,7 +577,7 @@ jobject AutoVectorAccess::value(JNIEnv * env, const void* container, jint index,
if(index >= 0 && index < d->size){
char* data = d->data();
void* v = data + index*m_offset;
- if(m_internalToExternalConverter(env, nullptr, v, &_value, true)){
+ if(m_internalToExternalConverter(env, nullptr, v, _value, true)){
return _value.l;
}
}else{
diff --git a/src/cpp/QtJambi/containeraccess_vector.h b/src/cpp/QtJambi/containeraccess_vector.h
index a6b556fe..dfe73af1 100644
--- a/src/cpp/QtJambi/containeraccess_vector.h
+++ b/src/cpp/QtJambi/containeraccess_vector.h
@@ -183,7 +183,7 @@ class GenericVectorAccess : public AbstractVectorAccess{
jvalue _value;
_value.l = nullptr;
- if(m_internalToExternalConverter(env, nullptr, &result, &_value, true)){
+ if(m_internalToExternalConverter(env, nullptr, &result, _value, true)){
return _value.l;
}
return nullptr;
@@ -197,7 +197,7 @@ class GenericVectorAccess : public AbstractVectorAccess{
QTJAMBI_ELEMENT_LOCKER
{
T qresult = reinterpret_cast *>(container)->value(index);
- success = m_internalToExternalConverter(env, nullptr, &qresult, &_result, true);
+ success = m_internalToExternalConverter(env, nullptr, &qresult, _result, true);
}
if(success){
@@ -219,7 +219,7 @@ class GenericVectorAccess : public AbstractVectorAccess{
_defaultValue.l = defaultValue;
if(m_externalToInternalConverter(env, nullptr, _defaultValue, _qdefaultValuePtr, jValueType::l)){
T qresult = reinterpret_cast *>(container)->value(index, _qdefaultValue);
- success = m_internalToExternalConverter(env, nullptr, &qresult, &_result, true);
+ success = m_internalToExternalConverter(env, nullptr, &qresult, _result, true);
}
}
diff --git a/src/cpp/QtJambi/containers.cpp b/src/cpp/QtJambi/containers.cpp
index 73715255..8770cd08 100644
--- a/src/cpp/QtJambi/containers.cpp
+++ b/src/cpp/QtJambi/containers.cpp
@@ -1388,7 +1388,12 @@ void CoreAPI::initializeQList(JNIEnv *env, jobject object, jclass elementType, Q
containerAccess->deleteContainer(listPtr);
containerAccess->dispose();
}else if(!isNativeContainer && other){
- containerAccess->appendList(env, listPtr, other);
+ jobject iter = QtJambiAPI::iteratorOfJavaCollection(env, other);
+ jint idx = 0;
+ containerAccess->reserve(env, listPtr, QtJambiAPI::sizeOfJavaCollection(env, other));
+ while(QtJambiAPI::hasJavaIteratorNext(env, iter)){
+ containerAccess->insert(env, listPtr, idx++, 1, QtJambiAPI::nextOfJavaIterator(env, iter));
+ }
}
}
@@ -1860,7 +1865,12 @@ void CoreAPI::initializeQVector(JNIEnv *env, jobject object, jclass elementType,
containerAccess->deleteContainer(listPtr);
containerAccess->dispose();
}else if(!isNativeContainer && other){
- containerAccess->appendVector(env, listPtr, other);
+ jobject iter = QtJambiAPI::iteratorOfJavaCollection(env, other);
+ jint idx = 0;
+ containerAccess->reserve(env, listPtr, QtJambiAPI::sizeOfJavaCollection(env, other));
+ while(QtJambiAPI::hasJavaIteratorNext(env, iter)){
+ containerAccess->insert(env, listPtr, idx++, 1, QtJambiAPI::nextOfJavaIterator(env, iter));
+ }
}
}
#endif
diff --git a/src/cpp/QtJambi/convert.cpp b/src/cpp/QtJambi/convert.cpp
index a239c4fa..a39f174f 100644
--- a/src/cpp/QtJambi/convert.cpp
+++ b/src/cpp/QtJambi/convert.cpp
@@ -431,7 +431,7 @@ jobject QtJambiAPI::convertQVariantToJavaObject(JNIEnv *env, const QVariant &qt_
true);
jvalue val;
val.l = nullptr;
- if(!converter || !converter(env, nullptr, qt_variant.constData(), &val, true)){
+ if(!converter || !converter(env, nullptr, qt_variant.constData(), val, true)){
qCWarning(DebugAPI::internalCategory, "Unable to convert qVariant to jobject");
}
return val.l;
@@ -814,7 +814,7 @@ void registerConverterVariant(JNIEnv *env, QMetaType metaType, QString qtName, c
}else if(JniEnvironment env{500}){
jvalue val;
val.l = nullptr;
- if(converter(env, nullptr, src, &val, true)){
+ if(converter(env, nullptr, src, val, true)){
new (target)JObjectWrapper(env, val.l);
return true;
}
@@ -834,7 +834,7 @@ void registerConverterVariant(JNIEnv *env, QMetaType metaType, QString qtName, c
}
jvalue val;
val.l = nullptr;
- if(converter(env, nullptr, src, &val, true)){
+ if(converter(env, nullptr, src, val, true)){
new (target)JObjectWrapper(env, val.l);
return true;
}
@@ -1839,7 +1839,12 @@ const void *QtJambiAPI::convertJavaObjectToNativeAsSmartPointer(JNIEnv *env, job
link->invalidate(env);
link.clear();
- link = QtJambiLink::createLinkForSmartPointerToQObject(env, java_object, createdByJava, is_shell, pointerCreator(ptr), pointerDeleter, pointerGetter);
+ const InterfaceOffsetInfo* interfaceOffsets = getInterfaceOffsets(env, env->GetObjectClass(java_object));
+ if(interfaceOffsets && !interfaceOffsets->offsets.isEmpty()){
+ link = QtJambiLink::createLinkForSmartPointerToQObject(env, java_object, createdByJava, is_shell, pointerCreator(ptr), pointerDeleter, pointerGetter, interfaceOffsets->offsets, interfaceOffsets->interfaces, interfaceOffsets->inheritedInterfaces);
+ }else{
+ link = QtJambiLink::createLinkForSmartPointerToQObject(env, java_object, createdByJava, is_shell, pointerCreator(ptr), pointerDeleter, pointerGetter);
+ }
Q_ASSERT(link && link->isSmartPointer());
if(shell){
shell->overrideLink(link);
@@ -1887,15 +1892,31 @@ const void *QtJambiAPI::convertJavaObjectToNativeAsSmartPointer(JNIEnv *env, job
link->invalidate(env);
link.clear();
- link = QtJambiLink::createLinkForSmartPointerToObject(env,
- java_object,
- LINK_NAME_ARG(className)
- createdByJava,
- is_shell,
- registeredOwnerFunction,
- pointerCreator(ptr),
- pointerDeleter,
- pointerGetter);
+ const InterfaceOffsetInfo* interfaceOffsets = getInterfaceOffsets(env, env->GetObjectClass(java_object));
+ if(interfaceOffsets && !interfaceOffsets->offsets.isEmpty()){
+ link = QtJambiLink::createLinkForSmartPointerToObject(env,
+ java_object,
+ LINK_NAME_ARG(className)
+ createdByJava,
+ is_shell,
+ registeredOwnerFunction,
+ pointerCreator(ptr),
+ pointerDeleter,
+ pointerGetter,
+ interfaceOffsets->offsets,
+ interfaceOffsets->interfaces,
+ interfaceOffsets->inheritedInterfaces);
+ }else{
+ link = QtJambiLink::createLinkForSmartPointerToObject(env,
+ java_object,
+ LINK_NAME_ARG(className)
+ createdByJava,
+ is_shell,
+ registeredOwnerFunction,
+ pointerCreator(ptr),
+ pointerDeleter,
+ pointerGetter);
+ }
if(shell){
shell->overrideLink(link);
}
@@ -1910,21 +1931,12 @@ const void *QtJambiAPI::convertJavaObjectToNativeAsSmartPointer(JNIEnv *env, job
return nullptr;
}
-void *internal_convertJavaInterfaceToNative(JNIEnv *env, jobject object, const std::type_info& typeId){
- if(QSharedPointer link = QtJambiLink::findLinkForJavaInterface(env, object))
- return link->typedPointer(typeId);
- else if(Java::QtJambi::QtObjectInterface::isInstanceOf(env, object))
- Java::QtJambi::QNoNativeResourcesException::throwNew(env, QStringLiteral("Incomplete object of type: %1").arg(QtJambiAPI::getObjectClassName(env, object).replace("$", ".")) QTJAMBI_STACKTRACEINFO );
- return nullptr;
-}
-
-void *QtJambiAPI::convertJavaInterfaceToNative(JNIEnv *env, jobject object,
- const char *, const std::type_info& typeId){
- return internal_convertJavaInterfaceToNative(env, object, typeId);
+void *QtJambiAPI::convertJavaInterfaceToNative(JNIEnv *env, jobject object, const char *, const std::type_info& typeId){
+ return QtJambiLink::findPointerForJavaInterface(env, object, typeId);
}
void *QtJambiAPI::convertJavaInterfaceToNative(JNIEnv *env, jobject object, const std::type_info& typeId){
- return internal_convertJavaInterfaceToNative(env, object, typeId);
+ return QtJambiLink::findPointerForJavaInterface(env, object, typeId);
}
jobject internal_convertNativeToJavaObject(JNIEnv *env, const void *qt_object, const std::type_info& typeId, const char *qtName, NativeToJavaConversionMode mode, bool *ok)
@@ -1940,10 +1952,7 @@ jobject internal_convertNativeToJavaObject(JNIEnv *env, const void *qt_object, c
if(offset!=0){
qt_object = reinterpret_cast(qt_object)-offset;
}
- QtJambiTypeEntry::NativeToJavaResult result = typeEntry->convertToJava(env, qt_object, mode==NativeToJavaConversionMode::MakeCopyOfValues, &jv, jValueType::l);
- if(result){
- if(mode==NativeToJavaConversionMode::TransferOwnership && result.link())
- result.link()->setJavaOwnership(env);
+ if(typeEntry->convertToJava(env, qt_object, mode, jv, jValueType::l)){
return jv.l;
}else{
return nullptr;
@@ -2153,6 +2162,25 @@ jobject internal_convertNativeToJavaObject(NativeToJavaConversionMode mode, JNIE
return nullptr;
}
+jobject QtJambiAPI::convertModelIndexToJavaObject(JNIEnv *env, const QModelIndex& index){
+ jobject result{nullptr};
+ if(QModelIndexTypeEntry::convertNativeToJava(env, &index, NativeToJavaConversionMode::MakeCopyOfValues, result)){
+ return result;
+ }else{
+ return nullptr;
+ }
+}
+
+bool QtJambiAPI::convertJavaToModelIndex(JNIEnv *env, jobject java_object, QModelIndex** output){
+ if(Java::QtCore::QModelIndex::isInstanceOf(env, java_object)){
+ *output = reinterpret_cast(QtJambiLink::findPointerForJavaObject(env, java_object));
+ return true;
+ }else if(env->IsSameObject(java_object, nullptr)){
+ return true;
+ }
+ return false;
+}
+
jobject QtJambiAPI::convertNativeToJavaObjectAsCopy(JNIEnv *env, const void *qt_object, jclass clazz){
return internal_convertNativeToJavaObject(NativeToJavaConversionMode::MakeCopyOfValues, env, qt_object, clazz);
}
@@ -2180,7 +2208,7 @@ jobject internal_convertSmartPointerToJavaObject_impl(JNIEnv *env,
return reinterpret_cast(result)-offset;
};
}
- if(typeEntry->convertSharedPointerToJava(env, ptr_shared_pointer, sharedPointerDeleter, sharedPointerGetter, &result, jValueType::l)){
+ if(typeEntry->convertSharedPointerToJava(env, ptr_shared_pointer, sharedPointerDeleter, sharedPointerGetter, result, jValueType::l)){
return result.l;
}else{
return nullptr;
@@ -2231,7 +2259,10 @@ jobject internal_convertSmartPointerToJavaObject_notype(JNIEnv *env, const char
if (!returned)
return nullptr;
- const QSharedPointer& link = QtJambiLink::createLinkForSmartPointerToObject(
+ const InterfaceOffsetInfo* interfaceOffsets = getInterfaceOffsets(env, clazz);
+ const QSharedPointer& link =
+ interfaceOffsets && !interfaceOffsets->offsets.isEmpty() ?
+ QtJambiLink::createLinkForSmartPointerToObject(
env,
returned,
LINK_NAME_ARG(nullptr)
@@ -2240,8 +2271,22 @@ jobject internal_convertSmartPointerToJavaObject_notype(JNIEnv *env, const char
nullptr,
ptr_shared_pointer,
sharedPointerDeleter,
- sharedPointerGetter
- );
+ sharedPointerGetter,
+ interfaceOffsets->offsets,
+ interfaceOffsets->interfaces,
+ interfaceOffsets->inheritedInterfaces
+ )
+ : QtJambiLink::createLinkForSmartPointerToObject(
+ env,
+ returned,
+ LINK_NAME_ARG(nullptr)
+ false,
+ false,
+ nullptr,
+ ptr_shared_pointer,
+ sharedPointerDeleter,
+ sharedPointerGetter
+ );
if (!link) {
returned = nullptr;
}
@@ -2304,7 +2349,12 @@ jobject internal_convertQObjectSmartPointerToJavaObject_notype(JNIEnv *env, cons
}
link->invalidate(env);
link.clear();
- link = QtJambiLink::createLinkForSmartPointerToQObject(env, object, createdByJava, is_shell, ptr_shared_pointer, shared_pointer_deleter, pointerGetter);
+ const InterfaceOffsetInfo* interfaceOffsets = getInterfaceOffsets(env, env->GetObjectClass(object));
+ if(interfaceOffsets && !interfaceOffsets->offsets.isEmpty()){
+ link = QtJambiLink::createLinkForSmartPointerToQObject(env, object, createdByJava, is_shell, ptr_shared_pointer, shared_pointer_deleter, pointerGetter, interfaceOffsets->offsets, interfaceOffsets->interfaces, interfaceOffsets->inheritedInterfaces);
+ }else{
+ link = QtJambiLink::createLinkForSmartPointerToQObject(env, object, createdByJava, is_shell, ptr_shared_pointer, shared_pointer_deleter, pointerGetter);
+ }
if(shell){
shell->overrideLink(link);
}
@@ -2402,7 +2452,12 @@ jobject internal_convertQObjectSmartPointerToJavaObject_notype(JNIEnv *env, cons
if (!object)
return nullptr;
- link = QtJambiLink::createLinkForSmartPointerToQObject(env, object, false, false, const_cast(ptr_shared_pointer), shared_pointer_deleter, pointerGetter);
+ const InterfaceOffsetInfo* interfaceOffsets = getInterfaceOffsets(env, clazz);
+ if(interfaceOffsets && !interfaceOffsets->offsets.isEmpty()){
+ link = QtJambiLink::createLinkForSmartPointerToQObject(env, object, false, false, const_cast(ptr_shared_pointer), shared_pointer_deleter, pointerGetter, interfaceOffsets->offsets, interfaceOffsets->interfaces, interfaceOffsets->inheritedInterfaces);
+ }else{
+ link = QtJambiLink::createLinkForSmartPointerToQObject(env, object, false, false, const_cast(ptr_shared_pointer), shared_pointer_deleter, pointerGetter);
+ }
if (!link) {
qCWarning(DebugAPI::internalCategory, "Qt Jambi: Couldn't created wrapper for class %s", className);
return nullptr;
@@ -2465,8 +2520,7 @@ jobject internal_convertQObjectToJavaObject_type(JNIEnv *env, const QObject *qt_
if(offset!=0){
ptr = reinterpret_cast(ptr)-offset;
}
- QtJambiTypeEntry::NativeToJavaResult result = typeEntry->convertToJava(env, ptr, false, &jv, jValueType::l);
- if(result){
+ if(typeEntry->convertToJava(env, ptr, NativeToJavaConversionMode::None, jv, jValueType::l)){
return jv.l;
}else{
return nullptr;
@@ -2535,10 +2589,8 @@ jobject internal_convertQObjectToJavaObject_notype(JNIEnv *env, const QObject *c
if(QtJambiTypeEntryPtr typeEntry = QtJambiTypeEntry::getTypeEntry(env, *_typeId)){
jvalue jv;
jv.l = nullptr;
- QtJambiTypeEntry::NativeToJavaResult result = typeEntry->convertToJava(env, qt_object, false, &jv, jValueType::l);
- if(result){
+ if(typeEntry->convertToJava(env, qt_object, NativeToJavaConversionMode::None, jv, jValueType::l))
return jv.l;
- }
}
}
const QMetaObject *mo = QtJambiMetaObject::findFirstStaticMetaObject(qt_object->metaObject());
@@ -2638,7 +2690,7 @@ jobject internal_convertQObjectSmartPointerToJavaObject_impl(JNIEnv *env, const
return reinterpret_cast(result)-offset;
};
}
- if(typeEntry->convertSharedPointerToJava(env, ptr_shared_pointer, shared_pointer_deleter, sharedPointerGetter, &result, jValueType::l)){
+ if(typeEntry->convertSharedPointerToJava(env, ptr_shared_pointer, shared_pointer_deleter, sharedPointerGetter, result, jValueType::l)){
return result.l;
}else{
return nullptr;
diff --git a/src/cpp/QtJambi/coreapi.cpp b/src/cpp/QtJambi/coreapi.cpp
index 38a05e68..47791be7 100644
--- a/src/cpp/QtJambi/coreapi.cpp
+++ b/src/cpp/QtJambi/coreapi.cpp
@@ -141,7 +141,7 @@ jobject CoreAPI::invokeMetaMethod(JNIEnv * env, jobject _metaMethod,
val[8],
val[9]);
if(ok && resultPtr){
- ok = parameterTypeInfos[0].convertInternalToExternal(env, nullptr, resultPtr, &result, true);
+ ok = parameterTypeInfos[0].convertInternalToExternal(env, nullptr, resultPtr, result, true);
}
}
}
@@ -276,7 +276,7 @@ jobject CoreAPI::invokeMetaMethodOnGadget(JNIEnv * env, jobject _metaMethod,
val[8],
val[9]);
if(ok && resultPtr){
- ok = parameterTypeInfos[0].convertInternalToExternal(env, nullptr, resultPtr, &result, true);
+ ok = parameterTypeInfos[0].convertInternalToExternal(env, nullptr, resultPtr, result, true);
}
}
}
@@ -371,7 +371,7 @@ jobject CoreAPI::readMetaPropertyOnGadget(JNIEnv *env, jobject _this, jobject ga
jvalue val;
val.l = nullptr;
QtJambiScope scope(nullptr);
- if(converter(env, &scope, variant.data(), &val, true))
+ if(converter(env, &scope, variant.data(), val, true))
return val.l;
}
}
@@ -396,7 +396,7 @@ jobject CoreAPI::readMetaPropertyOnGadget(JNIEnv *env, jobject _this, jobject ga
QMetaType _type(type);
InternalToExternalConverter converter = QtJambiTypeManager::getInternalToExternalConverter(env, qtName, _type, object_class);
QtJambiScope scope(nullptr);
- bool result = converter && converter(env, &scope, variant.data(), &val, true);
+ bool result = converter && converter(env, &scope, variant.data(), val, true);
if(result)
return val.l;
}else{
@@ -555,6 +555,14 @@ void CoreAPI::unregisterDependentObject(JNIEnv *env, jobject dependentObject, jo
}
}
+void CoreAPI::ckeckLinkExtension(JNIEnv *env, QtJambiNativeID nativeId){
+ QtJambiLink * link = reinterpret_cast(nativeId);
+ if(ExtendedLink* elink = dynamic_cast(link)){
+ if(!elink->hasExtension())
+ Java::QtJambi::QNoNativeResourcesException::throwNew(env, "Dependent object has been deleted." QTJAMBI_STACKTRACEINFO );
+ }
+}
+
QReadWriteLock* CoreAPI::objectDataLock()
{
return QtJambiLinkUserData::lock();
@@ -831,7 +839,7 @@ struct ResolvingInternalToExternalConverter{
return *this;
}
- bool operator()(JNIEnv* env, QtJambiScope* scope, const void* in, jvalue* out, bool forceBoxedType)const{
+ bool operator()(JNIEnv* env, QtJambiScope* scope, const void* in, jvalue& out, bool forceBoxedType)const{
if(m_elementClass){
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
QMetaType metaType(m_metaType);
@@ -890,7 +898,7 @@ struct ResolvingExternalToInternalConverter{
return *this;
}
- bool operator()(JNIEnv* env, QtJambiScope* scope, const jvalue&val, void* &out, jValueType valueType)const{
+ bool operator()(JNIEnv* env, QtJambiScope* scope, jvalue val, void* &out, jValueType valueType)const{
if(m_elementClass){
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
QMetaType metaType(m_metaType);
diff --git a/src/cpp/QtJambi/coreapi.h b/src/cpp/QtJambi/coreapi.h
index 895a7682..4fcefaac 100644
--- a/src/cpp/QtJambi/coreapi.h
+++ b/src/cpp/QtJambi/coreapi.h
@@ -105,6 +105,8 @@ class QTJAMBI_EXPORT ApplicationData : public QtJambiObjectData
namespace CoreAPI{
+QTJAMBI_EXPORT void ckeckLinkExtension(JNIEnv *env, QtJambiNativeID nativeId);
+
QTJAMBI_EXPORT QReadWriteLock* objectDataLock();
QTJAMBI_EXPORT jobject findObject(JNIEnv *env, const void * pointer);
diff --git a/src/cpp/QtJambi/debug.cpp b/src/cpp/QtJambi/debug.cpp
index a4b4a052..6a7e2e27 100644
--- a/src/cpp/QtJambi/debug.cpp
+++ b/src/cpp/QtJambi/debug.cpp
@@ -60,14 +60,18 @@ Q_LOGGING_CATEGORY(debugAPIInternalMethodsCategory, "io.qtjambi.debugapi.interna
Q_LOGGING_CATEGORY(debugAPIJavaOverloadsCategory, "io.qtjambi.debugapi.java-overloads")
Q_LOGGING_CATEGORY(debugAPINativeCallsCategory, "io.qtjambi.debugapi.native-calls")
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
+#if QT_VERSION < QT_VERSION_CHECK(6, 4, 0)
#define QTJAMBI_DEBUG_MESSAGE_LOGGER(category) \
for (bool qt_category_enabled = category().isDebugEnabled(); qt_category_enabled; qt_category_enabled = false) \
QMessageLogger(adaptFile(file), line, function, category().categoryName()).debug().nospace().noquote()
-#else
+#elif QT_VERSION < QT_VERSION_CHECK(6, 6, 0)
#define QTJAMBI_DEBUG_MESSAGE_LOGGER(category) \
for (QLoggingCategoryMacroHolder qt_category(&category); qt_category; qt_category.control = false) \
QMessageLogger(adaptFile(file), line, function, qt_category.name()).debug().nospace().noquote()
+#else
+#define QTJAMBI_DEBUG_MESSAGE_LOGGER(category) \
+for (QLoggingCategoryMacroHolder qt_category(category()); qt_category; qt_category.control = false) \
+ QMessageLogger(adaptFile(file), line, function, qt_category.name()).debug().nospace().noquote()
#endif
bool enabledMethodTracePrints(){
diff --git a/src/cpp/QtJambi/fileengine.cpp b/src/cpp/QtJambi/fileengine.cpp
index 72f98ff6..3e1a543d 100644
--- a/src/cpp/QtJambi/fileengine.cpp
+++ b/src/cpp/QtJambi/fileengine.cpp
@@ -778,9 +778,7 @@ class QUrlEntryEngine final : public QAbstractFileEngine, public QClassPathEntry
return true;
}
- FileFlags fileFlags(FileFlags) const override {
- return ExistsFlag | FileType | ReadGroupPerm | ReadOtherPerm | ReadOwnerPerm | ReadUserPerm;
- }
+ FileFlags fileFlags(FileFlags) const override;
QString classPathEntryName() const override {
return m_classPathEntryFileName;
@@ -792,6 +790,7 @@ class QUrlEntryEngine final : public QAbstractFileEngine, public QClassPathEntry
JObjectWrapper m_connection;
JObjectWrapper m_inputStream;
qint64 m_size;
+ FileFlags m_flags;
};
class QClassPathEngine final : public QAbstractFileEngine {
@@ -1414,7 +1413,7 @@ bool QClassPathEngine::addFromPath(JNIEnv* env, jobject url, const QString& file
url = Java::QtJambi::ResourceUtility::resolveUrlFromPath(env, qtjambi_cast(env, urlPath));
if(url){
QUrlEntryEngine* engine = new QUrlEntryEngine(env, url, fileName, urlPath);
- if(engine->size()>0) {
+ if(engine->fileFlags(QAbstractFileEngine::FileInfoAll).testFlag(QAbstractFileEngine::ExistsFlag)) {
QMutexLocker locker(&m_mutex);
m_engines << engine;
return true;
@@ -1433,13 +1432,26 @@ QUrlEntryEngine::QUrlEntryEngine(JNIEnv* env, jobject url, const QString& fileNa
m_fileName(fileName),
m_connection(),
m_inputStream(),
- m_size(0)
+ m_size(-1),
+ m_flags()
{
try{
jobject connection = Java::Runtime::URL::openConnection(env, url);
if(connection){
m_connection = {env, connection};
m_size = Java::Runtime::URLConnection::getContentLengthLong(env, connection);
+ m_flags.setFlag(ExistsFlag);
+ if(Java::Runtime::JarURLConnection::isInstanceOf(env, connection)
+ && Java::Runtime::ZipEntry::isDirectory(env, Java::Runtime::JarURLConnection::getJarEntry(env, connection))){
+ m_flags.setFlag(DirectoryType);
+ }else if(m_size==0){
+ m_flags.setFlag(DirectoryType);
+ }else{
+ m_flags.setFlag(FileType);
+ }
+ if(Java::Runtime::URLConnection::getDoInput(env, connection)){
+ m_flags |= ReadGroupPerm | ReadOtherPerm | ReadOwnerPerm | ReadUserPerm;
+ }
}
}catch(const JavaException& exn){
exn.report(env);
@@ -1471,7 +1483,7 @@ bool QUrlEntryEngine::open(QIODevice::OpenMode openMode
,std::optional
#endif
) {
- if((openMode & QIODevice::ReadOnly) && !m_inputStream){
+ if((openMode & QIODevice::ReadOnly) && !m_inputStream && !m_flags.testFlag(DirectoryType)){
if(JniEnvironment env{400}){
try{
m_inputStream = JObjectWrapper(env, Java::Runtime::URLConnection::getInputStream(env, m_connection.object()));
@@ -1500,6 +1512,10 @@ bool QUrlEntryEngine::close() {
return false;
}
+QAbstractFileEngine::FileFlags QUrlEntryEngine::fileFlags(FileFlags f) const {
+ return m_flags & f;
+}
+
class AccessResource : public QResource{
public:
static bool needsClassPathEngine(const QString &fileName, QStringList& resourceEntries);
diff --git a/src/cpp/QtJambi/java.cpp b/src/cpp/QtJambi/java.cpp
index 855b2800..b622ccfb 100644
--- a/src/cpp/QtJambi/java.cpp
+++ b/src/cpp/QtJambi/java.cpp
@@ -79,6 +79,8 @@ namespace Internal{
}
namespace QtCore{
+QTJAMBI_REPOSITORY_DEFINE_CLASS(io/qt/core,QModelIndex,
+ QTJAMBI_REPOSITORY_DEFINE_CONSTRUCTOR(Lio/qt/QtObject$QPrivateConstructor;))
QTJAMBI_REPOSITORY_DEFINE_CLASS(io/qt/core,QString,
QTJAMBI_REPOSITORY_DEFINE_CONSTRUCTOR(Lio/qt/QtObject$QPrivateConstructor;))
QTJAMBI_REPOSITORY_DEFINE_CLASS(io/qt/core,QChar,
@@ -1059,7 +1061,14 @@ QTJAMBI_REPOSITORY_DEFINE_CLASS(java/net,URL,
QTJAMBI_REPOSITORY_DEFINE_CLASS(java/net,URLConnection,
QTJAMBI_REPOSITORY_DEFINE_METHOD(getInputStream,()Ljava/io/InputStream;)
+ QTJAMBI_REPOSITORY_DEFINE_METHOD(getOutputStream,()Ljava/io/OutputStream;)
QTJAMBI_REPOSITORY_DEFINE_METHOD(getContentLengthLong,()J)
+ QTJAMBI_REPOSITORY_DEFINE_METHOD(getDoInput,()Z)
+ QTJAMBI_REPOSITORY_DEFINE_METHOD(getDoOutput,()Z)
+)
+
+QTJAMBI_REPOSITORY_DEFINE_CLASS(java/net,JarURLConnection,
+ QTJAMBI_REPOSITORY_DEFINE_METHOD(getJarEntry,()Ljava/util/jar/JarEntry;)
)
QTJAMBI_REPOSITORY_DEFINE_CLASS(java/io,InputStream,
@@ -1071,6 +1080,7 @@ QTJAMBI_REPOSITORY_DEFINE_CLASS(java/io,InputStream,
QTJAMBI_REPOSITORY_DEFINE_CLASS(java/util/zip,ZipEntry,
QTJAMBI_REPOSITORY_DEFINE_METHOD(getName,()Ljava/lang/String;)
QTJAMBI_REPOSITORY_DEFINE_METHOD(getSize,()J)
+ QTJAMBI_REPOSITORY_DEFINE_METHOD(isDirectory,()Z)
)
QTJAMBI_REPOSITORY_DEFINE_CLASS(java/lang,ClassLoader,
diff --git a/src/cpp/QtJambi/java_p.h b/src/cpp/QtJambi/java_p.h
index b2ab05dc..a97a0e47 100644
--- a/src/cpp/QtJambi/java_p.h
+++ b/src/cpp/QtJambi/java_p.h
@@ -42,6 +42,8 @@ namespace Java{
QTJAMBI_REPOSITORY_DECLARE_STATIC_VOID_METHOD(execPostRoutines)
)
}
+ QTJAMBI_REPOSITORY_DECLARE_CLASS(QModelIndex,
+ QTJAMBI_REPOSITORY_DECLARE_CONSTRUCTOR())
QTJAMBI_REPOSITORY_DECLARE_CLASS(QPluginLoader,
QTJAMBI_REPOSITORY_DECLARE_STATIC_OBJECT_METHOD(loadPluginInstance)
)
@@ -160,11 +162,18 @@ namespace Java{
QTJAMBI_REPOSITORY_DECLARE_CLASS(URLConnection,
QTJAMBI_REPOSITORY_DECLARE_OBJECT_METHOD(getInputStream)
- QTJAMBI_REPOSITORY_DECLARE_LONG_METHOD(getContentLengthLong))
+ QTJAMBI_REPOSITORY_DECLARE_OBJECT_METHOD(getOutputStream)
+ QTJAMBI_REPOSITORY_DECLARE_LONG_METHOD(getContentLengthLong)
+ QTJAMBI_REPOSITORY_DECLARE_BOOLEAN_METHOD(getDoInput)
+ QTJAMBI_REPOSITORY_DECLARE_BOOLEAN_METHOD(getDoOutput))
+
+ QTJAMBI_REPOSITORY_DECLARE_CLASS(JarURLConnection,
+ QTJAMBI_REPOSITORY_DECLARE_OBJECT_METHOD(getJarEntry))
QTJAMBI_REPOSITORY_DECLARE_CLASS(ZipEntry,
QTJAMBI_REPOSITORY_DECLARE_STRING_METHOD(getName)
- QTJAMBI_REPOSITORY_DECLARE_LONG_METHOD(getSize))
+ QTJAMBI_REPOSITORY_DECLARE_LONG_METHOD(getSize)
+ QTJAMBI_REPOSITORY_DECLARE_BOOLEAN_METHOD(isDirectory))
QTJAMBI_REPOSITORY_DECLARE_CLASS(InputStream,
QTJAMBI_REPOSITORY_DECLARE_VOID_METHOD(close)
diff --git a/src/cpp/QtJambi/jni_metatype.cpp b/src/cpp/QtJambi/jni_metatype.cpp
index d3a7dad9..67dc7778 100644
--- a/src/cpp/QtJambi/jni_metatype.cpp
+++ b/src/cpp/QtJambi/jni_metatype.cpp
@@ -393,7 +393,7 @@ QTJAMBI_FUNCTION_PREFIX(Java_io_qt_internal_MetaTypeUtility_registerConverter)
if(JniEnvironment env{500}){
jvalue jv;
jv.l = nullptr;
- if(parameter1.convertInternalToExternal(env, nullptr, src, &jv, true)){
+ if(parameter1.convertInternalToExternal(env, nullptr, src, jv, true)){
jobject result{nullptr};
try{
result = Java::Runtime::Function::apply(env, converter.object(), jv.l);
diff --git a/src/cpp/QtJambi/jni_signals.cpp b/src/cpp/QtJambi/jni_signals.cpp
index be80cf6f..61dfbe98 100644
--- a/src/cpp/QtJambi/jni_signals.cpp
+++ b/src/cpp/QtJambi/jni_signals.cpp
@@ -717,7 +717,7 @@ void NativeSlotObject::impl(int which, QSlotObjectBase *this_, QObject *, void *
for (int i = 0; i < converted_arguments.size(); ++i) {
const ParameterTypeInfo& parameterTypeInfo = parameterTypeInfos[i+1];
converted_arguments[i].l = nullptr;
- if(!parameterTypeInfo.convertInternalToExternal(env, &scope, a[i+1], &converted_arguments[i], true)){
+ if(!parameterTypeInfo.convertInternalToExternal(env, &scope, a[i+1], converted_arguments[i], true)){
success = false;
break;
}
diff --git a/src/cpp/QtJambi/qtjambi_cast_impl_jnitype.h b/src/cpp/QtJambi/qtjambi_cast_impl_jnitype.h
index e214c24f..ce4586d2 100644
--- a/src/cpp/QtJambi/qtjambi_cast_impl_jnitype.h
+++ b/src/cpp/QtJambi/qtjambi_cast_impl_jnitype.h
@@ -303,7 +303,42 @@ struct qtjambi_jnitype_copy_assignable_decider_cast{
template
struct qtjambi_jnitype_qobject_decider_cast
- : qtjambi_move_or_copy_decider{};
+ : qtjambi_move_or_copy_decider{};
+
+#ifdef QABSTRACTITEMMODEL_H
+template
+struct qtjambi_jnitype_qobject_decider_cast{
+ constexpr static jobject cast(JNIEnv * env, const QModelIndex& in, const char*, QtJambiScope*){
+ return QtJambiAPI::convertModelIndexToJavaObject(env, in);
+ }
+};
+
+template
+struct qtjambi_jnitype_qobject_decider_cast{
+ typedef typename std::conditional::type, QModelIndex>::type QModelIndex_c;
+ static QModelIndex_c cast(JNIEnv * env, jobject in, const char*, QtJambiScope*){
+ QModelIndex* result = nullptr;
+ if(!QtJambiAPI::convertJavaToModelIndex(env, in, &result)){
+ JavaException::raiseIllegalArgumentException(env, QStringLiteral("Cannot cast object of type %1 to %2").arg(in ? QtJambiAPI::getObjectClassName(env, in) : QStringLiteral("null")).arg(QLatin1String(QtJambiAPI::typeName(typeid(QModelIndex)))) QTJAMBI_STACKTRACEINFO );
+ }
+ return result ? *result : QModelIndex();
+ }
+};
+
+
+template
+struct qtjambi_jnitype_qobject_decider_cast{
+ typedef typename std::conditional::type, QModelIndex>::type QModelIndex_c;
+ typedef typename std::conditional::type, QModelIndex_c>::type QModelIndex_cr;
+ static QModelIndex_cr cast(JNIEnv * env, jobject in, const char*, QtJambiScope*){
+ QModelIndex* result = nullptr;
+ if(!QtJambiAPI::convertJavaToModelIndex(env, in, &result)){
+ JavaException::raiseIllegalArgumentException(env, QStringLiteral("Cannot cast object of type %1 to %2").arg(in ? QtJambiAPI::getObjectClassName(env, in) : QStringLiteral("null")).arg(QLatin1String(QtJambiAPI::typeName(typeid(QModelIndex)))) QTJAMBI_STACKTRACEINFO );
+ }
+ return deref_ptr_or_default::deref(result);
+ }
+};
+#endif
template
diff --git a/src/cpp/QtJambi/qtjambiapi.h b/src/cpp/QtJambi/qtjambiapi.h
index dd3ffc50..b82c89c3 100644
--- a/src/cpp/QtJambi/qtjambiapi.h
+++ b/src/cpp/QtJambi/qtjambiapi.h
@@ -349,6 +349,10 @@ QTJAMBI_EXPORT jobject convertNativeToJavaObjectAsCopy(JNIEnv *env, const void *
QTJAMBI_EXPORT jobject convertNativeToJavaObjectAsCopy(JNIEnv *env, const void *qt_object, jclass clazz);
+QTJAMBI_EXPORT jobject convertModelIndexToJavaObject(JNIEnv *env, const class QModelIndex& index);
+
+QTJAMBI_EXPORT bool convertJavaToModelIndex(JNIEnv *env, jobject java_object, class QModelIndex** output);
+
template
jobject convertNativeToJavaOwnedObjectAsWrapper(JNIEnv *env, const T *qt_object, const char *nativeTypeName = nullptr)
{
diff --git a/src/cpp/QtJambi/qtjambilink.cpp b/src/cpp/QtJambi/qtjambilink.cpp
index 4afdfd8b..905b3309 100644
--- a/src/cpp/QtJambi/qtjambilink.cpp
+++ b/src/cpp/QtJambi/qtjambilink.cpp
@@ -542,7 +542,11 @@ const QSharedPointer& QtJambiLink::createLinkForNewQObject(JNIEnv *
return *gDefaultPointer;
}
-const QSharedPointer& QtJambiLink::createLinkForSmartPointerToQObject(JNIEnv *env, jobject javaObject, bool created_by_java, bool is_shell, void* ptr_shared_pointer, SmartPointerDeleter pointerDeleter, SmartPointerGetterFunction pointerGetter, const QMetaObject* superTypeForCustomMetaObject)
+const QSharedPointer& QtJambiLink::createLinkForSmartPointerToQObject(JNIEnv *env, jobject javaObject, bool created_by_java, bool is_shell, void* ptr_shared_pointer, SmartPointerDeleter pointerDeleter, SmartPointerGetterFunction pointerGetter,
+ const QMap& offsets,
+ const QSet& interfaces,
+ const QMap>& inheritedInterfaces,
+ const QMetaObject* superTypeForCustomMetaObject)
{
Q_ASSERT(env);
Q_ASSERT(javaObject);
@@ -552,16 +556,38 @@ const QSharedPointer& QtJambiLink::createLinkForSmartPointerToQObje
// Initialize the link
jobject nativeLink = getNativeLink(env, javaObject);
- const InterfaceOffsetInfo* interfaceOffsets = getInterfaceOffsets(env, env->GetObjectClass(javaObject));
- QtJambiLink* qtJambiLink;
QObject* object = reinterpret_cast(pointerGetter(ptr_shared_pointer));
Q_ASSERT(object);
JavaException ocurredException;
- if(interfaceOffsets && !interfaceOffsets->offsets.isEmpty()){
- qtJambiLink = new QSharedPointerToQObjectInterfaceLink(env, nativeLink, javaObject, interfaceOffsets->offsets, interfaceOffsets->interfaces, interfaceOffsets->inheritedInterfaces, object, created_by_java, is_shell, ptr_shared_pointer, pointerDeleter, pointerGetter, superTypeForCustomMetaObject, ocurredException);
+ QtJambiLink* qtJambiLink = new QSharedPointerToQObjectInterfaceLink(env, nativeLink, javaObject, offsets, interfaces, inheritedInterfaces, object, created_by_java, is_shell, ptr_shared_pointer, pointerDeleter, pointerGetter, superTypeForCustomMetaObject, ocurredException);
+ if(ocurredException.object()){
+ qtJambiLink->dispose();
+ ocurredException.raise();
+ Q_ASSERT(false);// should not reach this
}else{
- qtJambiLink = new QSharedPointerToQObjectLink(env, nativeLink, javaObject, object, created_by_java, is_shell, ptr_shared_pointer, pointerDeleter, pointerGetter, superTypeForCustomMetaObject, ocurredException);
+ qtJambiLink->init(env);
}
+ if(qtJambiLink->qobject()->parent())
+ qtJambiLink->setCppOwnership(env);
+ else
+ qtJambiLink->setJavaOwnership(env);
+ return qtJambiLink->getStrongPointer();
+}
+
+const QSharedPointer& QtJambiLink::createLinkForSmartPointerToQObject(JNIEnv *env, jobject javaObject, bool created_by_java, bool is_shell, void* ptr_shared_pointer, SmartPointerDeleter pointerDeleter, SmartPointerGetterFunction pointerGetter, const QMetaObject* superTypeForCustomMetaObject)
+{
+ Q_ASSERT(env);
+ Q_ASSERT(javaObject);
+ Q_ASSERT(ptr_shared_pointer);
+ Q_ASSERT(pointerDeleter);
+ Q_ASSERT(pointerGetter);
+
+ // Initialize the link
+ jobject nativeLink = getNativeLink(env, javaObject);
+ QObject* object = reinterpret_cast(pointerGetter(ptr_shared_pointer));
+ Q_ASSERT(object);
+ JavaException ocurredException;
+ QtJambiLink* qtJambiLink = new QSharedPointerToQObjectLink(env, nativeLink, javaObject, object, created_by_java, is_shell, ptr_shared_pointer, pointerDeleter, pointerGetter, superTypeForCustomMetaObject, ocurredException);
if(ocurredException.object()){
qtJambiLink->dispose();
ocurredException.raise();
@@ -576,6 +602,65 @@ const QSharedPointer& QtJambiLink::createLinkForSmartPointerToQObje
return qtJambiLink->getStrongPointer();
}
+const QSharedPointer& QtJambiLink::createExtendedLinkForSmartPointerToObject(JNIEnv *env, jobject javaObject,
+ LINK_NAME_ARG(const char* qt_name)
+ bool created_by_java, bool is_shell, const QObject* extension, PtrOwnerFunction ownerFunction,
+ void* ptr_shared_pointer, SmartPointerDeleter pointerDeleter, SmartPointerGetterFunction pointerGetter)
+{
+ Q_ASSERT(env);
+ Q_ASSERT(javaObject);
+ Q_ASSERT(ptr_shared_pointer);
+ Q_ASSERT(pointerDeleter);
+ Q_ASSERT(pointerGetter);
+
+ // Initialize the link
+ jobject nativeLink = getNativeLink(env, javaObject);
+ JavaException ocurredException;
+ QtJambiLink* qtJambiLink = new ExtendedSmartPointerToObjectLink(env, nativeLink, javaObject,
+ LINK_NAME_ARG(qt_name)
+ created_by_java, is_shell, extension, ownerFunction, ptr_shared_pointer, pointerDeleter, pointerGetter, ocurredException);
+ if(ocurredException.object()){
+ qtJambiLink->dispose();
+ ocurredException.raise();
+ Q_ASSERT(false);// should not reach this
+ }else{
+ qtJambiLink->init(env);
+ }
+ qtJambiLink->setJavaOwnership(env);
+ return qtJambiLink->getStrongPointer();
+}
+
+const QSharedPointer& QtJambiLink::createLinkForSmartPointerToObject(JNIEnv *env, jobject javaObject,
+ LINK_NAME_ARG(const char* qt_name)
+ bool created_by_java, bool is_shell, PtrOwnerFunction ownerFunction,
+ void* ptr_shared_pointer, SmartPointerDeleter pointerDeleter, SmartPointerGetterFunction pointerGetter,
+ const QMap& offsets,
+ const QSet& interfaces,
+ const QMap>& inheritedInterfaces)
+{
+ Q_ASSERT(env);
+ Q_ASSERT(javaObject);
+ Q_ASSERT(ptr_shared_pointer);
+ Q_ASSERT(pointerDeleter);
+ Q_ASSERT(pointerGetter);
+
+ // Initialize the link
+ jobject nativeLink = getNativeLink(env, javaObject);
+ JavaException ocurredException;
+ QtJambiLink* qtJambiLink = new SmartPointerToObjectInterfaceLink(env, nativeLink, javaObject, offsets, interfaces, inheritedInterfaces,
+ LINK_NAME_ARG(qt_name)
+ created_by_java, is_shell, ownerFunction, ptr_shared_pointer, pointerDeleter, pointerGetter, ocurredException);
+ if(ocurredException.object()){
+ qtJambiLink->dispose();
+ ocurredException.raise();
+ Q_ASSERT(false);// should not reach this
+ }else{
+ qtJambiLink->init(env);
+ }
+ qtJambiLink->setJavaOwnership(env);
+ return qtJambiLink->getStrongPointer();
+}
+
const QSharedPointer& QtJambiLink::createLinkForSmartPointerToObject(JNIEnv *env, jobject javaObject,
LINK_NAME_ARG(const char* qt_name)
bool created_by_java, bool is_shell, PtrOwnerFunction ownerFunction,
@@ -589,18 +674,40 @@ const QSharedPointer& QtJambiLink::createLinkForSmartPointerToObjec
// Initialize the link
jobject nativeLink = getNativeLink(env, javaObject);
- const InterfaceOffsetInfo* interfaceOffsets = getInterfaceOffsets(env, env->GetObjectClass(javaObject));
JavaException ocurredException;
- QtJambiLink* qtJambiLink;
- if(interfaceOffsets && !interfaceOffsets->offsets.isEmpty()){
- qtJambiLink = new SmartPointerToObjectInterfaceLink(env, nativeLink, javaObject, interfaceOffsets->offsets, interfaceOffsets->interfaces, interfaceOffsets->inheritedInterfaces,
- LINK_NAME_ARG(qt_name)
- created_by_java, is_shell, ownerFunction, ptr_shared_pointer, pointerDeleter, pointerGetter, ocurredException);
+ QtJambiLink* qtJambiLink = new SmartPointerToObjectLink(env, nativeLink, javaObject,
+ LINK_NAME_ARG(qt_name)
+ created_by_java, is_shell, ownerFunction, ptr_shared_pointer, pointerDeleter, pointerGetter, ocurredException);
+ if(ocurredException.object()){
+ qtJambiLink->dispose();
+ ocurredException.raise();
+ Q_ASSERT(false);// should not reach this
}else{
- qtJambiLink = new SmartPointerToObjectLink(env, nativeLink, javaObject,
- LINK_NAME_ARG(qt_name)
- created_by_java, is_shell, ownerFunction, ptr_shared_pointer, pointerDeleter, pointerGetter, ocurredException);
+ qtJambiLink->init(env);
}
+ qtJambiLink->setJavaOwnership(env);
+ return qtJambiLink->getStrongPointer();
+}
+
+const QSharedPointer& QtJambiLink::createLinkForSmartPointerToContainer(JNIEnv *env, jobject javaObject,
+ LINK_NAME_ARG(const char* qt_name)
+ void* ptr_shared_pointer, SmartPointerDeleter pointerDeleter, SmartPointerGetterFunction pointerGetter, AbstractContainerAccess* containerAccess,
+ const QMap& offsets,
+ const QSet& interfaces,
+ const QMap>& inheritedInterfaces)
+{
+ Q_ASSERT(env);
+ Q_ASSERT(javaObject);
+ Q_ASSERT(ptr_shared_pointer);
+ Q_ASSERT(pointerDeleter);
+ Q_ASSERT(pointerGetter);
+
+ // Initialize the link
+ jobject nativeLink = getNativeLink(env, javaObject);
+ JavaException ocurredException;
+ QtJambiLink* qtJambiLink = new QSharedPointerToContainerInterfaceLink(env, nativeLink, javaObject, offsets, interfaces, inheritedInterfaces,
+ LINK_NAME_ARG(qt_name)
+ false, false, nullptr, ptr_shared_pointer, pointerDeleter, pointerGetter, containerAccess, ocurredException);
if(ocurredException.object()){
qtJambiLink->dispose();
ocurredException.raise();
@@ -624,18 +731,10 @@ const QSharedPointer& QtJambiLink::createLinkForSmartPointerToConta
// Initialize the link
jobject nativeLink = getNativeLink(env, javaObject);
- const InterfaceOffsetInfo* interfaceOffsets = getInterfaceOffsets(env, env->GetObjectClass(javaObject));
JavaException ocurredException;
- QtJambiLink* qtJambiLink;
- if(interfaceOffsets && !interfaceOffsets->offsets.isEmpty()){
- qtJambiLink = new QSharedPointerToContainerInterfaceLink(env, nativeLink, javaObject, interfaceOffsets->offsets, interfaceOffsets->interfaces, interfaceOffsets->inheritedInterfaces,
- LINK_NAME_ARG(qt_name)
- false, false, nullptr, ptr_shared_pointer, pointerDeleter, pointerGetter, containerAccess, ocurredException);
- }else{
- qtJambiLink = new QSharedPointerToContainerLink(env, nativeLink, javaObject,
- LINK_NAME_ARG(qt_name)
- false, false, nullptr, ptr_shared_pointer, pointerDeleter, pointerGetter, containerAccess, ocurredException);
- }
+ QtJambiLink* qtJambiLink = new QSharedPointerToContainerLink(env, nativeLink, javaObject,
+ LINK_NAME_ARG(qt_name)
+ false, false, nullptr, ptr_shared_pointer, pointerDeleter, pointerGetter, containerAccess, ocurredException);
if(ocurredException.object()){
qtJambiLink->dispose();
ocurredException.raise();
@@ -1112,6 +1211,87 @@ const QSharedPointer& QtJambiLink::createLinkForDependentObject(JNI
return qtJambiLink->getStrongPointer();
}
+const QSharedPointer& QtJambiLink::createLinkForDependentObject(JNIEnv *env, jobject javaObject, void *ptr,
+ LINK_NAME_ARG(const char* qt_name)
+ bool created_by_java, bool is_shell,
+ PtrDeleterFunction destructor_function,
+ const QObject* dependsOn, QtJambiLink::Ownership ownership)
+{
+ Q_ASSERT(env);
+ Q_ASSERT(javaObject);
+ Q_ASSERT(ptr);
+ Q_ASSERT(destructor_function);
+
+ // Initialize the link
+ jobject nativeLink = getNativeLink(env, javaObject);
+ JavaException ocurredException;
+ QtJambiLink* qtJambiLink = new DependentDeletablePointerToObjectLink(env, nativeLink, javaObject,
+ LINK_NAME_ARG(qt_name)
+ ptr, created_by_java, is_shell, destructor_function, ocurredException);
+ if(ocurredException.object()){
+ qtJambiLink->dispose();
+ ocurredException.raise();
+ Q_ASSERT(false);// should not reach this
+ }else{
+ qtJambiLink->init(env);
+ }
+ switch(ownership){
+ case QtJambiLink::Ownership::Java:
+ qtJambiLink->setJavaOwnership(env);
+ break;
+ case QtJambiLink::Ownership::Cpp:
+ qtJambiLink->setCppOwnership(env);
+ break;
+ default:
+ if(created_by_java){
+ qtJambiLink->setJavaOwnership(env);
+ }
+ break;
+ }
+ QtJambiLink::registerDependentObject(dependsOn, qtJambiLink->getStrongPointer());
+ return qtJambiLink->getStrongPointer();
+}
+
+const QSharedPointer& QtJambiLink::createExtendedLinkForObject(JNIEnv *env, jobject javaObject, void *ptr,
+ LINK_NAME_ARG(const char* qt_name)
+ bool created_by_java, bool is_shell,
+ PtrDeleterFunction destructor_function,
+ const QObject* extension, QtJambiLink::Ownership ownership)
+{
+ Q_ASSERT(env);
+ Q_ASSERT(javaObject);
+ Q_ASSERT(ptr);
+ Q_ASSERT(destructor_function);
+
+ // Initialize the link
+ jobject nativeLink = getNativeLink(env, javaObject);
+ JavaException ocurredException;
+ QtJambiLink* qtJambiLink = new ExtendedDeletablePointerToObjectLink(env, nativeLink, javaObject,
+ LINK_NAME_ARG(qt_name)
+ ptr, created_by_java, is_shell, destructor_function, extension, ocurredException);
+ if(ocurredException.object()){
+ qtJambiLink->dispose();
+ ocurredException.raise();
+ Q_ASSERT(false);// should not reach this
+ }else{
+ qtJambiLink->init(env);
+ }
+ switch(ownership){
+ case QtJambiLink::Ownership::Java:
+ qtJambiLink->setJavaOwnership(env);
+ break;
+ case QtJambiLink::Ownership::Cpp:
+ qtJambiLink->setCppOwnership(env);
+ break;
+ default:
+ if(created_by_java){
+ qtJambiLink->setJavaOwnership(env);
+ }
+ break;
+ }
+ return qtJambiLink->getStrongPointer();
+}
+
const QSharedPointer& QtJambiLink::createLinkForDependentObject(JNIEnv *env, jobject javaObject, void *ptr, const QMetaType& metaType,
bool created_by_java, bool is_shell, const QObject* dependsOn, QtJambiLink::Ownership ownership)
{
@@ -1960,11 +2140,7 @@ const QSharedPointer& QtJambiLink::findLinkForJavaInterface(JNIEnv
JObjectSynchronizer sync(env, nativeLink);
Q_UNUSED(sync)
QtJambiNativeID nativeId = QtJambiNativeID(Java::QtJambi::NativeUtility$NativeLink::native__id(env, nativeLink));
- const QSharedPointer& qtJambiLink = fromNativeId(nativeId);
-#if defined(QTJAMBI_DEBUG_TOOLS)
- Q_ASSERT(!qtJambiLink || QtJambiLink::checkLink(qtJambiLink.data())); // check the C++ pointer is valid
-#endif
- return qtJambiLink;
+ return fromNativeId(nativeId);
}
}
return *gDefaultPointer;
@@ -1978,15 +2154,47 @@ const QSharedPointer& QtJambiLink::findLinkForJavaObject(JNIEnv *en
JObjectSynchronizer sync(env, nativeLink);
Q_UNUSED(sync)
QtJambiNativeID nativeId = QtJambiNativeID(Java::QtJambi::NativeUtility$NativeLink::native__id(env, nativeLink));
- const QSharedPointer& qtJambiLink = fromNativeId(nativeId);
-#if defined(QTJAMBI_DEBUG_TOOLS)
- Q_ASSERT(!qtJambiLink || QtJambiLink::checkLink(qtJambiLink.data())); // check the C++ pointer is valid
-#endif
- return qtJambiLink;
+ return fromNativeId(nativeId);
}
return *gDefaultPointer;
}
+void* QtJambiLink::findPointerForJavaInterface(JNIEnv *env, jobject java, const std::type_info& typeId)
+{
+ if(Java::QtJambi::QtObjectInterface::isInstanceOf(env, java)){
+ if(jobject nativeLink = Java::QtJambi::NativeUtility::findInterfaceLink(env, java, true, true)){
+ JObjectSynchronizer sync(env, nativeLink);
+ Q_UNUSED(sync)
+ QtJambiNativeID nativeId = QtJambiNativeID(Java::QtJambi::NativeUtility$NativeLink::native__id(env, nativeLink));
+ if(QtJambiLink * link = reinterpret_cast(nativeId)){
+ if(link->isMultiInheritanceType()){
+ if(link->isInterfaceAvailable(typeId))
+ return link->typedPointer(typeId);
+ else return nullptr;
+ }else return link->pointer();
+ }
+ }
+ }else if(env->IsSameObject(nullptr, java))
+ return nullptr;
+ Java::QtJambi::QNoNativeResourcesException::throwNew(env, QStringLiteral("Incomplete object of type: %1").arg(QtJambiAPI::getObjectClassName(env, java).replace("$", ".")) QTJAMBI_STACKTRACEINFO );
+ return nullptr;
+}
+
+void* QtJambiLink::findPointerForJavaObject(JNIEnv *env, jobject java)
+{
+ if (env->IsSameObject(nullptr, java))
+ return nullptr;
+ else if(jobject nativeLink = Java::QtJambi::NativeUtility$Object::nativeLink(env, java)){
+ JObjectSynchronizer sync(env, nativeLink);
+ Q_UNUSED(sync)
+ QtJambiNativeID nativeId = QtJambiNativeID(Java::QtJambi::NativeUtility$NativeLink::native__id(env, nativeLink));
+ if(QtJambiLink * link = reinterpret_cast(nativeId))
+ return link->pointer();
+ }
+ Java::QtJambi::QNoNativeResourcesException::throwNew(env, QStringLiteral("Incomplete object of type: %1").arg(QtJambiAPI::getObjectClassName(env, java).replace("$", ".")) QTJAMBI_STACKTRACEINFO );
+ return nullptr;
+}
+
#if defined(QTJAMBI_DEBUG_TOOLS)
void QtJambiLink::validateMagic_unlocked(const char *prefix)
{
@@ -3594,6 +3802,18 @@ void SmartPointerLink::setSplitOwnership(JNIEnv *){}
// #### END ###################### SmartPointerLink ######################## END ####
+ExtendedSmartPointerToObjectLink::ExtendedSmartPointerToObjectLink(JNIEnv *env, jobject nativeLink, jobject jobj,
+ LINK_NAME_ARG(const char* qt_name)
+ bool created_by_java, bool is_shell, const QObject* extension,
+ PtrOwnerFunction ownerFunction, void* ptr_shared_pointer,
+ SmartPointerDeleter shared_pointer_deleter, SmartPointerGetterFunction pointerGetter, JavaException& ocurredException)
+ : SmartPointerToObjectLink(env, nativeLink, jobj,
+ LINK_NAME_ARG(qt_name)
+ created_by_java, is_shell,
+ ownerFunction, ptr_shared_pointer,
+ shared_pointer_deleter, pointerGetter,
+ ocurredException), ExtendedLink(), m_extension(extension){}
+
// ### BEGIN ################# SmartPointerToObjectLink ################### BEGIN ###
QSharedPointerToContainerLink::QSharedPointerToContainerLink(JNIEnv *env, jobject nativeLink, jobject jobj,
@@ -4507,6 +4727,43 @@ QSharedPointerToQObjectInterfaceLink::QSharedPointerToQObjectInterfaceLink(JNIEn
}
}
+ExtendedLink::~ExtendedLink(){}
+
+ExtendedDeletablePointerToObjectLink::ExtendedDeletablePointerToObjectLink(JNIEnv *env, jobject nativeLink, jobject jobj,
+ LINK_NAME_ARG(const char* qt_name)
+ void *ptr, bool created_by_java, bool is_shell, PtrDeleterFunction destructor_function,
+ const QObject* extension, JavaException& ocurredException)
+ : DeletablePointerToObjectLink(env, nativeLink, jobj,
+ LINK_NAME_ARG(qt_name)
+ ptr, created_by_java, is_shell, destructor_function, ocurredException),
+ ExtendedLink(),
+ m_extension(extension)
+{}
+
+DependentDeletablePointerToObjectLink::DependentDeletablePointerToObjectLink(JNIEnv *env, jobject nativeLink, jobject jobj,
+ LINK_NAME_ARG(const char* qt_name)
+ void *ptr, bool created_by_java, bool is_shell, PtrDeleterFunction destructor_function, JavaException& ocurredException)
+ : DeletablePointerToObjectLink(env, nativeLink, jobj,
+ LINK_NAME_ARG(qt_name)
+ ptr, created_by_java, is_shell, destructor_function, ocurredException)
+{}
+
+void DependentDeletablePointerToObjectLink::setDependencyManager(DependencyManagerUserData* dependencyManager) {
+ m_dependencyManager = dependencyManager;
+}
+
+void DependentDeletablePointerToObjectLink::deleteNativeObject(JNIEnv *env, bool forced){
+ if(m_dependencyManager)
+ m_dependencyManager->removeDependentObject(m_this);
+ DeletablePointerToObjectLink::deleteNativeObject(env, forced);
+}
+
+void DependentDeletablePointerToObjectLink::invalidate(JNIEnv *env){
+ if(m_dependencyManager)
+ m_dependencyManager->removeDependentObject(m_this);
+ DeletablePointerToObjectLink::invalidate(env);
+}
+
DependentMetaTypedPointerToObjectLink::DependentMetaTypedPointerToObjectLink(JNIEnv *env, jobject nativeLink, jobject jobj,
void *ptr, const QMetaType& metaType, bool created_by_java, bool is_shell, JavaException& ocurredException)
: MetaTypedPointerToObjectLink(env, nativeLink, jobj, ptr, metaType, created_by_java, is_shell, ocurredException)
diff --git a/src/cpp/QtJambi/qtjambilink_p.h b/src/cpp/QtJambi/qtjambilink_p.h
index d3a27da5..65291784 100644
--- a/src/cpp/QtJambi/qtjambilink_p.h
+++ b/src/cpp/QtJambi/qtjambilink_p.h
@@ -324,6 +324,16 @@ class QtJambiLink{
const QMap& interfaceOffsets,
const QSet& interfaceTypes,
const QMap>& inheritedInterfaces);
+ static const QSharedPointer& createLinkForDependentObject(JNIEnv *env, jobject java, void *ptr,
+ LINK_NAME_ARG(const char* qt_name)
+ bool created_by_java, bool is_shell,
+ PtrDeleterFunction destructor_function,
+ const QObject* dependsOn, QtJambiLink::Ownership ownership);
+ static const QSharedPointer& createExtendedLinkForObject(JNIEnv *env, jobject java, void *ptr,
+ LINK_NAME_ARG(const char* qt_name)
+ bool created_by_java, bool is_shell,
+ PtrDeleterFunction destructor_function,
+ const QObject* extension, QtJambiLink::Ownership ownership);
static const QSharedPointer& createLinkForDependentObject(JNIEnv *env, jobject java, void *ptr, const QMetaType& metaType,
bool created_by_java, bool is_shell, const QObject* dependsOn, QtJambiLink::Ownership ownership);
static const QSharedPointer& createLinkForDependentObject(JNIEnv *env, jobject java, void *ptr, const QMetaType& metaType,
@@ -346,9 +356,24 @@ class QtJambiLink{
static const QSharedPointer& createLinkForSmartPointerToObject(JNIEnv *env, jobject java,
LINK_NAME_ARG(const char* qt_name)
bool created_by_java, bool is_shell, PtrOwnerFunction ownerFunction, void* ptr_shared_pointer, SmartPointerDeleter pointerDeleter, SmartPointerGetterFunction pointerGetter);
+ static const QSharedPointer& createLinkForSmartPointerToObject(JNIEnv *env, jobject java,
+ LINK_NAME_ARG(const char* qt_name)
+ bool created_by_java, bool is_shell, PtrOwnerFunction ownerFunction, void* ptr_shared_pointer, SmartPointerDeleter pointerDeleter, SmartPointerGetterFunction pointerGetter,
+ const QMap& offsets,
+ const QSet& interfaces,
+ const QMap>& inheritedInterfaces);
+ static const QSharedPointer& createExtendedLinkForSmartPointerToObject(JNIEnv *env, jobject java,
+ LINK_NAME_ARG(const char* qt_name)
+ bool created_by_java, bool is_shell, const QObject* extension, PtrOwnerFunction ownerFunction, void* ptr_shared_pointer, SmartPointerDeleter pointerDeleter, SmartPointerGetterFunction pointerGetter);
static const QSharedPointer& createLinkForSmartPointerToContainer(JNIEnv *env, jobject java,
LINK_NAME_ARG(const char* qt_name)
void* ptr_shared_pointer, SmartPointerDeleter pointerDeleter, SmartPointerGetterFunction pointerGetter, AbstractContainerAccess* containerAccess);
+ static const QSharedPointer& createLinkForSmartPointerToContainer(JNIEnv *env, jobject java,
+ LINK_NAME_ARG(const char* qt_name)
+ void* ptr_shared_pointer, SmartPointerDeleter pointerDeleter, SmartPointerGetterFunction pointerGetter, AbstractContainerAccess* containerAccess,
+ const QMap& offsets,
+ const QSet& interfaces,
+ const QMap>& inheritedInterfaces);
static const QSharedPointer& createLinkForQObject(JNIEnv *env, jobject java, QObject *object, bool created_by_java, bool is_shell, const QMetaObject* superTypeForCustomMetaObject = nullptr);
static const QSharedPointer& createLinkForNativeQObject(JNIEnv *env, jobject java, QObject *object, bool created_by_java, bool is_shell, const QMetaObject* superTypeForCustomMetaObject);
static const QSharedPointer& createLinkForNativeQObject(JNIEnv *env, jobject java, QObject *object, bool created_by_java, bool is_shell, const QMetaObject* superTypeForCustomMetaObject,
@@ -356,6 +381,10 @@ class QtJambiLink{
const QSet& interfaceTypes,
const QMap>& inheritedInterfaces);
static const QSharedPointer& createLinkForSmartPointerToQObject(JNIEnv *env, jobject java, bool created_by_java, bool is_shell, void* ptr_shared_pointer, SmartPointerDeleter pointerDeleter, SmartPointerGetterFunction pointerGetter, const QMetaObject* superTypeForCustomMetaObject = nullptr);
+ static const QSharedPointer& createLinkForSmartPointerToQObject(JNIEnv *env, jobject java, bool created_by_java, bool is_shell, void* ptr_shared_pointer, SmartPointerDeleter pointerDeleter, SmartPointerGetterFunction pointerGetter,
+ const QMap& offsets,
+ const QSet& interfaces,
+ const QMap>& inheritedInterfaces, const QMetaObject* superTypeForCustomMetaObject = nullptr);
static const QSharedPointer& createLinkForNewQObject(JNIEnv *env, jclass objectClass, jobject nativeLink, jobject java, const std::type_info& typeId, const QMetaObject* metaObject, QObject *object, const SuperTypeInfos* superTypeInfos, bool created_by_java, bool isDeclarativeCall, bool is_shell, bool hasCustomMetaObject, JavaException& ocurredException);
static const QSharedPointer& createLinkForNewObject(JNIEnv *env, jclass objectClass, jobject nativeLink, jobject java, const std::type_info& typeId, void *ptr, const SuperTypeInfos* superTypeInfos, const QMetaType& metaType, bool created_by_java, bool is_shell, PtrOwnerFunction ownerFunction, JavaException& ocurredException);
static const QSharedPointer& createLinkForNewObject(JNIEnv *env, jclass objectClass, jobject nativeLink, jobject java, const std::type_info& typeId, void *ptr, const SuperTypeInfos* superTypeInfos, const QMetaType& metaType, bool created_by_java, bool is_shell, JavaException& ocurredException);
@@ -370,6 +399,8 @@ class QtJambiLink{
static QList> findLinksForPointer(const void *ptr);
static const QSharedPointer& findLinkForJavaObject(JNIEnv *env, jobject java);
static const QSharedPointer& findLinkForJavaInterface(JNIEnv *env, jobject java);
+ static void* findPointerForJavaObject(JNIEnv *env, jobject java);
+ static void* findPointerForJavaInterface(JNIEnv *env, jobject java, const std::type_info& typeId);
static int getObjectCacheOperationCount();
static int getObjectCacheMode();
static void setObjectCacheMode(int object_cache_mode);
@@ -643,6 +674,39 @@ class DeletablePointerToObjectLink : public PointerToObjectLink{
friend class DeletablePointerToContainerLink;
};
+class ExtendedLink{
+protected:
+ ExtendedLink() = default;
+ virtual ~ExtendedLink();
+public:
+ virtual bool hasExtension()const = 0;
+};
+
+class ExtendedDeletablePointerToObjectLink : public DeletablePointerToObjectLink, public ExtendedLink{
+protected:
+ ExtendedDeletablePointerToObjectLink(JNIEnv *env, jobject nativeLink, jobject jobj,
+ LINK_NAME_ARG(const char* qt_name)
+ void *ptr, bool created_by_java, bool is_shell, PtrDeleterFunction destructor_function, const QObject* extension, JavaException& ocurredException);
+public:
+ inline bool hasExtension()const override{return !m_extension.isNull(); }
+private:
+ QPointer m_extension;
+ friend QtJambiLink;
+};
+
+class DependentDeletablePointerToObjectLink : public DeletablePointerToObjectLink, public DependentLink{
+protected:
+ DependentDeletablePointerToObjectLink(JNIEnv *env, jobject nativeLink, jobject jobj,
+ LINK_NAME_ARG(const char* qt_name)
+ void *ptr, bool created_by_java, bool is_shell, PtrDeleterFunction destructor_function, JavaException& ocurredException);
+ void setDependencyManager(DependencyManagerUserData*) override;
+ void deleteNativeObject(JNIEnv *env, bool forced) override;
+ void invalidate(JNIEnv *env) override;
+private:
+ DependencyManagerUserData* m_dependencyManager;
+ friend QtJambiLink;
+};
+
class DeletablePointerToContainerLink : public DeletablePointerToObjectLink{
protected:
DeletablePointerToContainerLink(JNIEnv *env, jobject nativeLink, jobject jobj,
@@ -878,6 +942,20 @@ class SmartPointerToObjectLink : public SmartPointerLink{
friend QtJambiLink;
};
+class ExtendedSmartPointerToObjectLink : public SmartPointerToObjectLink, public ExtendedLink{
+protected:
+ ExtendedSmartPointerToObjectLink(JNIEnv *env, jobject nativeLink, jobject jobj,
+ LINK_NAME_ARG(const char* qt_name)
+ bool created_by_java, bool is_shell, const QObject* extension,
+ PtrOwnerFunction ownerFunction, void* ptr_shared_pointer,
+ SmartPointerDeleter shared_pointer_deleter, SmartPointerGetterFunction pointerGetter, JavaException& ocurredException);
+ friend QtJambiLink;
+public:
+ inline bool hasExtension()const override{return !m_extension.isNull(); }
+private:
+ QPointer m_extension;
+};
+
class QSharedPointerToContainerLink : public SmartPointerToObjectLink{
protected:
QSharedPointerToContainerLink(JNIEnv *env, jobject nativeLink, jobject jobj,
diff --git a/src/cpp/QtJambi/qtjambimetaobject.cpp b/src/cpp/QtJambi/qtjambimetaobject.cpp
index 9a74436d..d0618dac 100644
--- a/src/cpp/QtJambi/qtjambimetaobject.cpp
+++ b/src/cpp/QtJambi/qtjambimetaobject.cpp
@@ -124,12 +124,12 @@ Q_GLOBAL_STATIC(SignalTypesHash, gSignalTypes);
InternalToExternalConverter ParameterTypeInfo::default_internalToExternalConverter()
{
- return InternalToExternalConverter([](JNIEnv*, QtJambiScope*, const void*, jvalue*, bool)->bool{ return false; });
+ return InternalToExternalConverter([](JNIEnv*, QtJambiScope*, const void*, jvalue&, bool)->bool{ return false; });
}
ExternalToInternalConverter ParameterTypeInfo::default_externalToInternalConverter()
{
- return ExternalToInternalConverter([](JNIEnv*, QtJambiScope*, const jvalue&, void* &, jValueType) ->bool { return false; });
+ return ExternalToInternalConverter([](JNIEnv*, QtJambiScope*, jvalue, void* &, jValueType) ->bool { return false; });
}
ParameterTypeInfo::ParameterTypeInfo()
@@ -285,13 +285,13 @@ void ParameterTypeInfo::resolveE2I(JNIEnv* env){
m_resolvedE2I = true;
}
-bool ParameterTypeInfo::convertInternalToExternal(JNIEnv* env, QtJambiScope* scope, const void* in, jvalue* out, bool forceBoxedType) const {
+bool ParameterTypeInfo::convertInternalToExternal(JNIEnv* env, QtJambiScope* scope, const void* in, jvalue& out, bool forceBoxedType) const {
if(!m_resolvedI2E)
const_cast(this)->resolveI2E(env);
return m_internalToExternalConverter && m_internalToExternalConverter(env, scope, in, out, forceBoxedType);
}
-bool ParameterTypeInfo::convertExternalToInternal(JNIEnv* env, QtJambiScope* scope, const jvalue& in,void* & out, jValueType valueType) const {
+bool ParameterTypeInfo::convertExternalToInternal(JNIEnv* env, QtJambiScope* scope, jvalue in,void* & out, jValueType valueType) const {
if(!m_resolvedE2I)
const_cast(this)->resolveE2I(env);
return m_externalToInternalConverter && m_externalToInternalConverter(env, scope, in, out, valueType);
@@ -1163,7 +1163,7 @@ void QtJambiMetaObjectPrivate::invokeMethod(JNIEnv *env, jobject object, const J
for (int i = 0; i < converted_arguments.size(); ++i) {
const ParameterTypeInfo& parameterTypeInfo = methodInfo.parameterTypeInfos[i + 1];
converted_arguments[i].l = nullptr;
- if (!parameterTypeInfo.convertInternalToExternal(env, &scope, _a[i+1], &converted_arguments[i], forceObjectType || !Java::Runtime::Class::isPrimitive(env, parameterTypeInfo.javaClass()))) {
+ if (!parameterTypeInfo.convertInternalToExternal(env, &scope, _a[i+1], converted_arguments[i], forceObjectType || !Java::Runtime::Class::isPrimitive(env, parameterTypeInfo.javaClass()))) {
success = false;
break;
}
@@ -1279,7 +1279,7 @@ void QtJambiMetaObjectPrivate::invokeConstructor(JNIEnv *env, const JMethodInfo&
for (int i = 0; i < converted_arguments.size(); ++i) {
const ParameterTypeInfo& parameterTypeInfo = methodInfo.parameterTypeInfos[i + 1];
converted_arguments[i].l = nullptr;
- if (!parameterTypeInfo.convertInternalToExternal(env, &scope, _a[i+1], &converted_arguments[i], !Java::Runtime::Class::isPrimitive(env, parameterTypeInfo.javaClass()))) {
+ if (!parameterTypeInfo.convertInternalToExternal(env, &scope, _a[i+1], converted_arguments[i], !Java::Runtime::Class::isPrimitive(env, parameterTypeInfo.javaClass()))) {
success = false;
break;
}
@@ -1497,13 +1497,13 @@ const QList& QtJambiMetaObject::methodParameterInfo(JNIEnv *
result->append(ParameterTypeInfo(
info.metaTypeId,
getGlobalClassRef(env, Java::Runtime::Byte::primitiveType(env)),
- [](JNIEnv* env, QtJambiScope*, const void* in, jvalue* out, bool forceBoxedType)->bool{
- out->b = *reinterpret_cast(in);
+ [](JNIEnv* env, QtJambiScope*, const void* in, jvalue& out, bool forceBoxedType)->bool{
+ out.b = *reinterpret_cast(in);
if(forceBoxedType)
- out->l = QtJambiAPI::toJavaByteObject(env, out->b);
+ out.l = QtJambiAPI::toJavaByteObject(env, out.b);
return true;
},
- [](JNIEnv* env, QtJambiScope* scope, const jvalue& in, void* &out, jValueType valueType) -> bool {
+ [](JNIEnv* env, QtJambiScope* scope, jvalue in, void* &out, jValueType valueType) -> bool {
qint8 _in;
switch(valueType){
case jValueType::l:
@@ -1530,13 +1530,13 @@ const QList& QtJambiMetaObject::methodParameterInfo(JNIEnv *
result->append(ParameterTypeInfo(
info.metaTypeId,
getGlobalClassRef(env, Java::Runtime::Short::primitiveType(env)),
- [](JNIEnv* env, QtJambiScope*, const void* in, jvalue* out, bool forceBoxedType)->bool{
- out->s = *reinterpret_cast(in);
+ [](JNIEnv* env, QtJambiScope*, const void* in, jvalue& out, bool forceBoxedType)->bool{
+ out.s = *reinterpret_cast(in);
if(forceBoxedType)
- out->l = QtJambiAPI::toJavaShortObject(env, out->s);
+ out.l = QtJambiAPI::toJavaShortObject(env, out.s);
return true;
},
- [](JNIEnv* env, QtJambiScope* scope, const jvalue& in, void* &out, jValueType valueType) -> bool {
+ [](JNIEnv* env, QtJambiScope* scope, jvalue in, void* &out, jValueType valueType) -> bool {
qint16 _in;
switch(valueType){
case jValueType::l:
@@ -1566,13 +1566,13 @@ const QList& QtJambiMetaObject::methodParameterInfo(JNIEnv *
result->append(ParameterTypeInfo(
info.metaTypeId,
getGlobalClassRef(env, Java::Runtime::Integer::primitiveType(env)),
- [](JNIEnv* env, QtJambiScope*, const void* in, jvalue* out, bool forceBoxedType)->bool{
- out->i = *reinterpret_cast(in);
+ [](JNIEnv* env, QtJambiScope*, const void* in, jvalue& out, bool forceBoxedType)->bool{
+ out.i = *reinterpret_cast(in);
if(forceBoxedType)
- out->l = QtJambiAPI::toJavaIntegerObject(env, out->i);
+ out.l = QtJambiAPI::toJavaIntegerObject(env, out.i);
return true;
},
- [](JNIEnv* env, QtJambiScope* scope, const jvalue& in, void* &out, jValueType valueType) -> bool {
+ [](JNIEnv* env, QtJambiScope* scope, jvalue in, void* &out, jValueType valueType) -> bool {
qint32 _in;
switch(valueType){
case jValueType::l:
@@ -1599,13 +1599,13 @@ const QList& QtJambiMetaObject::methodParameterInfo(JNIEnv *
result->append(ParameterTypeInfo(
info.metaTypeId,
getGlobalClassRef(env, Java::Runtime::Long::primitiveType(env)),
- [](JNIEnv* env, QtJambiScope*, const void* in, jvalue* out, bool forceBoxedType)->bool{
- out->j = *reinterpret_cast(in);
+ [](JNIEnv* env, QtJambiScope*, const void* in, jvalue& out, bool forceBoxedType)->bool{
+ out.j = *reinterpret_cast(in);
if(forceBoxedType)
- out->l = QtJambiAPI::toJavaLongObject(env, out->j);
+ out.l = QtJambiAPI::toJavaLongObject(env, out.j);
return true;
},
- [](JNIEnv* env, QtJambiScope* scope, const jvalue& in, void* &out, jValueType valueType) -> bool {
+ [](JNIEnv* env, QtJambiScope* scope, jvalue in, void* &out, jValueType valueType) -> bool {
qint64 _in;
switch(valueType){
case jValueType::l:
@@ -1633,13 +1633,13 @@ const QList& QtJambiMetaObject::methodParameterInfo(JNIEnv *
result->append(ParameterTypeInfo(
info.metaTypeId,
getGlobalClassRef(env, Java::Runtime::Integer::primitiveType(env)),
- [](JNIEnv* env, QtJambiScope*, const void* in, jvalue* out, bool forceBoxedType)->bool{
- out->i = *reinterpret_cast(in);
+ [](JNIEnv* env, QtJambiScope*, const void* in, jvalue& out, bool forceBoxedType)->bool{
+ out.i = *reinterpret_cast(in);
if(forceBoxedType)
- out->l = QtJambiAPI::toJavaIntegerObject(env, out->i);
+ out.l = QtJambiAPI::toJavaIntegerObject(env, out.i);
return true;
},
- [](JNIEnv* env, QtJambiScope* scope, const jvalue& in, void* &out, jValueType valueType) -> bool {
+ [](JNIEnv* env, QtJambiScope* scope, jvalue in, void* &out, jValueType valueType) -> bool {
qint32 _in;
switch(valueType){
case jValueType::l:
@@ -1664,13 +1664,13 @@ const QList& QtJambiMetaObject::methodParameterInfo(JNIEnv *
result->append(ParameterTypeInfo(
info.metaTypeId,
getGlobalClassRef(env, Java::Runtime::Long::primitiveType(env)),
- [](JNIEnv* env, QtJambiScope*, const void* in, jvalue* out, bool forceBoxedType)->bool{
- out->j = *reinterpret_cast(in);
+ [](JNIEnv* env, QtJambiScope*, const void* in, jvalue& out, bool forceBoxedType)->bool{
+ out.j = *reinterpret_cast(in);
if(forceBoxedType)
- out->l = QtJambiAPI::toJavaLongObject(env, out->j);
+ out.l = QtJambiAPI::toJavaLongObject(env, out.j);
return true;
},
- [](JNIEnv* env, QtJambiScope* scope, const jvalue& in, void* &out, jValueType valueType) -> bool {
+ [](JNIEnv* env, QtJambiScope* scope, jvalue in, void* &out, jValueType valueType) -> bool {
qint64 _in;
switch(valueType){
case jValueType::l:
@@ -1700,13 +1700,13 @@ const QList& QtJambiMetaObject::methodParameterInfo(JNIEnv *
result->append(ParameterTypeInfo(
info.metaTypeId,
getGlobalClassRef(env, Java::Runtime::Character::primitiveType(env)),
- [](JNIEnv* env, QtJambiScope*, const void* in, jvalue* out, bool forceBoxedType)->bool{
- out->c = jchar(reinterpret_cast(in)->unicode());
+ [](JNIEnv* env, QtJambiScope*, const void* in, jvalue& out, bool forceBoxedType)->bool{
+ out.c = jchar(reinterpret_cast(in)->unicode());
if(forceBoxedType)
- out->l = QtJambiAPI::toJavaCharacterObject(env, out->c);
+ out.l = QtJambiAPI::toJavaCharacterObject(env, out.c);
return true;
},
- [](JNIEnv* env, QtJambiScope* scope, const jvalue& in, void* &out, jValueType valueType) -> bool {
+ [](JNIEnv* env, QtJambiScope* scope, jvalue in, void* &out, jValueType valueType) -> bool {
QChar _in;
switch(valueType){
case jValueType::l:
@@ -1732,13 +1732,13 @@ const QList& QtJambiMetaObject::methodParameterInfo(JNIEnv *
result->append(ParameterTypeInfo(
info.metaTypeId,
getGlobalClassRef(env, Java::Runtime::Float::primitiveType(env)),
- [](JNIEnv* env, QtJambiScope*, const void* in, jvalue* out, bool forceBoxedType)->bool{
- out->f = *reinterpret_cast(in);
+ [](JNIEnv* env, QtJambiScope*, const void* in, jvalue& out, bool forceBoxedType)->bool{
+ out.f = *reinterpret_cast(in);
if(forceBoxedType)
- out->l = QtJambiAPI::toJavaFloatObject(env, out->f);
+ out.l = QtJambiAPI::toJavaFloatObject(env, out.f);
return true;
},
- [](JNIEnv* env, QtJambiScope* scope, const jvalue& in, void* &out, jValueType valueType) -> bool {
+ [](JNIEnv* env, QtJambiScope* scope, jvalue in, void* &out, jValueType valueType) -> bool {
float _in;
switch(valueType){
case jValueType::l:
@@ -1764,13 +1764,13 @@ const QList& QtJambiMetaObject::methodParameterInfo(JNIEnv *
result->append(ParameterTypeInfo(
info.metaTypeId,
getGlobalClassRef(env, Java::Runtime::Double::primitiveType(env)),
- [](JNIEnv* env, QtJambiScope*, const void* in, jvalue* out, bool forceBoxedType)->bool{
- out->d = *reinterpret_cast(in);
+ [](JNIEnv* env, QtJambiScope*, const void* in, jvalue& out, bool forceBoxedType)->bool{
+ out.d = *reinterpret_cast(in);
if(forceBoxedType)
- out->l = QtJambiAPI::toJavaDoubleObject(env, out->d);
+ out.l = QtJambiAPI::toJavaDoubleObject(env, out.d);
return true;
},
- [](JNIEnv* env, QtJambiScope* scope, const jvalue& in, void* &out, jValueType valueType) -> bool {
+ [](JNIEnv* env, QtJambiScope* scope, jvalue in, void* &out, jValueType valueType) -> bool {
double _in;
switch(valueType){
case jValueType::l:
@@ -1796,13 +1796,13 @@ const QList& QtJambiMetaObject::methodParameterInfo(JNIEnv *
result->append(ParameterTypeInfo(
info.metaTypeId,
getGlobalClassRef(env, Java::Runtime::Boolean::primitiveType(env)),
- [](JNIEnv* env, QtJambiScope*, const void* in, jvalue* out, bool forceBoxedType)->bool{
- out->z = *reinterpret_cast(in);
+ [](JNIEnv* env, QtJambiScope*, const void* in, jvalue& out, bool forceBoxedType)->bool{
+ out.z = *reinterpret_cast(in);
if(forceBoxedType)
- out->l = QtJambiAPI::toJavaBooleanObject(env, out->z);
+ out.l = QtJambiAPI::toJavaBooleanObject(env, out.z);
return true;
},
- [](JNIEnv* env, QtJambiScope* scope, const jvalue& in, void* &out, jValueType valueType) -> bool {
+ [](JNIEnv* env, QtJambiScope* scope, jvalue in, void* &out, jValueType valueType) -> bool {
bool _in;
switch(valueType){
case jValueType::l:
@@ -1828,11 +1828,11 @@ const QList& QtJambiMetaObject::methodParameterInfo(JNIEnv *
result->append(ParameterTypeInfo(
info.metaTypeId,
getGlobalClassRef(env, Java::Runtime::String::getClass(env)),
- [](JNIEnv* env, QtJambiScope*, const void* in, jvalue* out, bool)->bool{
- out->l = qtjambi_cast(env, *reinterpret_cast(in));
+ [](JNIEnv* env, QtJambiScope*, const void* in, jvalue& out, bool)->bool{
+ out.l = qtjambi_cast(env, *reinterpret_cast(in));
return true;
},
- [](JNIEnv* env, QtJambiScope* scope, const jvalue& in, void* &out, jValueType) -> bool {
+ [](JNIEnv* env, QtJambiScope* scope, jvalue in, void* &out, jValueType) -> bool {
if(scope && !out){
QString* _out = new QString;
scope->addDeletion(_out);
@@ -1849,11 +1849,11 @@ const QList& QtJambiMetaObject::methodParameterInfo(JNIEnv *
result->append(ParameterTypeInfo(
info.metaTypeId,
getGlobalClassRef(env, Java::QtCore::QByteArray::getClass(env)),
- [](JNIEnv* env, QtJambiScope*, const void* in, jvalue* out, bool)->bool{
- out->l = qtjambi_cast(env, *reinterpret_cast(in));
+ [](JNIEnv* env, QtJambiScope*, const void* in, jvalue& out, bool)->bool{
+ out.l = qtjambi_cast(env, *reinterpret_cast(in));
return true;
},
- [](JNIEnv* env, QtJambiScope* scope, const jvalue& in, void* &out, jValueType) -> bool {
+ [](JNIEnv* env, QtJambiScope* scope, jvalue in, void* &out, jValueType) -> bool {
if(scope && !out){
QByteArray* _out = new QByteArray;
scope->addDeletion(_out);
@@ -1870,11 +1870,11 @@ const QList& QtJambiMetaObject::methodParameterInfo(JNIEnv *
result->append(ParameterTypeInfo(
info.metaTypeId,
getGlobalClassRef(env, Java::Runtime::Object::getClass(env)),
- [](JNIEnv* env, QtJambiScope*, const void* in, jvalue* out, bool)->bool{
- out->l = qtjambi_cast(env, *reinterpret_cast(in));
+ [](JNIEnv* env, QtJambiScope*, const void* in, jvalue& out, bool)->bool{
+ out.l = qtjambi_cast(env, *reinterpret_cast(in));
return true;
},
- [](JNIEnv* env, QtJambiScope* scope, const jvalue& in, void* &out, jValueType) -> bool {
+ [](JNIEnv* env, QtJambiScope* scope, jvalue in, void* &out, jValueType) -> bool {
if(scope && !out){
QVariant* _out = new QVariant;
scope->addDeletion(_out);
@@ -1952,11 +1952,11 @@ const QList& QtJambiMetaObject::methodParameterInfo(JNIEnv *
}else{
InternalToExternalConverter internalToExternalConverter;
if(method.methodType()==QMetaMethod::Signal && i>0){
- internalToExternalConverter = [](JNIEnv* env, QtJambiScope* scope, const void* in, jvalue* p, bool) -> bool{
- p->l = Java::QtJambi::QNativePointer::fromNative(env, jlong(in), int(QNativePointer::Type::Pointer), jlong(-1), 0, true);
- Java::QtJambi::QNativePointer::setVerificationEnabled(env, p->l, true);
+ internalToExternalConverter = [](JNIEnv* env, QtJambiScope* scope, const void* in, jvalue& p, bool) -> bool{
+ p.l = Java::QtJambi::QNativePointer::fromNative(env, jlong(in), int(QNativePointer::Type::Pointer), jlong(-1), 0, true);
+ Java::QtJambi::QNativePointer::setVerificationEnabled(env, p.l, true);
if(scope){
- JObjectWrapper obj(env, p->l);
+ JObjectWrapper obj(env, p.l);
scope->addFinalAction([obj](){
if(JniEnvironment env{200}){
Java::QtJambi::QNativePointer::invalidate(env, obj.object());
@@ -2408,7 +2408,7 @@ int QtJambiMetaObject::writeProperty(JNIEnv *env, jobject object, int _id, void
case jValueType::l:
jvalue value;
value.l = nullptr;
- if (d->m_propertyMembers[_id].memberTypeInfo.convertInternalToExternal(env, nullptr, _a[0], &value, true)) {
+ if (d->m_propertyMembers[_id].memberTypeInfo.convertInternalToExternal(env, nullptr, _a[0], value, true)) {
env->SetStaticObjectField(d->m_propertyMembers[_id].declaringClass, d->m_propertyMembers[_id].member, value.l);
JavaException::check(env QTJAMBI_STACKTRACEINFO );
break;
@@ -2477,7 +2477,7 @@ int QtJambiMetaObject::writeProperty(JNIEnv *env, jobject object, int _id, void
case jValueType::l:
jvalue value;
value.l = nullptr;
- if (d->m_propertyMembers[_id].memberTypeInfo.convertInternalToExternal(env, nullptr, _a[0], &value, true)) {
+ if (d->m_propertyMembers[_id].memberTypeInfo.convertInternalToExternal(env, nullptr, _a[0], value, true)) {
env->SetObjectField(object, fieldId, value.l);
JavaException::check(env QTJAMBI_STACKTRACEINFO );
break;
diff --git a/src/cpp/QtJambi/qtjambimetaobject_p.h b/src/cpp/QtJambi/qtjambimetaobject_p.h
index 8d313b94..693263dd 100644
--- a/src/cpp/QtJambi/qtjambimetaobject_p.h
+++ b/src/cpp/QtJambi/qtjambimetaobject_p.h
@@ -71,8 +71,8 @@ class ParameterTypeInfo{
ParameterTypeInfo(ParameterTypeInfo&& other);
ParameterTypeInfo& operator=(ParameterTypeInfo&& other);
- bool convertInternalToExternal(JNIEnv* env, QtJambiScope* scope, const void* in, jvalue* out, bool forceBoxedType) const;
- bool convertExternalToInternal(JNIEnv* env, QtJambiScope* scope, const jvalue& in,void* & out, jValueType valueType) const;
+ bool convertInternalToExternal(JNIEnv* env, QtJambiScope* scope, const void* in, jvalue& out, bool forceBoxedType) const;
+ bool convertExternalToInternal(JNIEnv* env, QtJambiScope* scope, jvalue in,void* & out, jValueType valueType) const;
jclass javaClass() const;
int metaType() const;
static InternalToExternalConverter default_internalToExternalConverter();
diff --git a/src/cpp/QtJambi/registry.cpp b/src/cpp/QtJambi/registry.cpp
index 2ed45bd2..e6872f33 100644
--- a/src/cpp/QtJambi/registry.cpp
+++ b/src/cpp/QtJambi/registry.cpp
@@ -949,7 +949,7 @@ bool QmlAPI::registerMetaTypeConverter(JNIEnv *env, const QMetaType& metaType1,
if(JniEnvironment env{200}){
jvalue jv;
jv.l = nullptr;
- if(parameter1.convertInternalToExternal(env, nullptr, src, &jv, true)){
+ if(parameter1.convertInternalToExternal(env, nullptr, src, jv, true)){
jobject result{nullptr};
try{
result = env->NewObject(parameter2.javaClass(), constructor, jv.l);
@@ -2096,6 +2096,7 @@ jclass registeredJavaClassForCustomMetaType(QMetaType metaType){
}
const QMetaObject *findWrappersMetaObject(const QtPrivate::QMetaTypeInterface *iface){
+ const QMetaObject* meta_object = nullptr;
if(JniEnvironment env{200}){
try {
jclass clazz = nullptr;
@@ -2104,7 +2105,8 @@ const QMetaObject *findWrappersMetaObject(const QtPrivate::QMetaTypeInterface *i
clazz = (*gMetaTypeJavaTypeHash)[iface];
}
if(clazz){
- if(const QMetaObject* meta_object = CoreAPI::metaObjectForClass(env, clazz)){
+ meta_object = CoreAPI::metaObjectForClass(env, clazz);
+ if(meta_object){
registerMetaObjectByMetaTypeInterface(iface, meta_object);
const_cast(iface)->metaObjectFn = &metaobjectByMetaTypeInterface;
}else{
@@ -2115,7 +2117,7 @@ const QMetaObject *findWrappersMetaObject(const QtPrivate::QMetaTypeInterface *i
}catch(const JavaException&){
}
}
- return nullptr;
+ return meta_object;
}
QList registeredCustomMetaTypesForJavaClass(const QByteArray& javaClass){
@@ -3345,9 +3347,11 @@ int qtjambi_register_enum_meta_type(JNIEnv *env, jclass clazz, const QString& ja
}
return true;
};
- QMetaType::registerConverterFunction(conv, metaType, QMetaType::fromType());
+ if(!QMetaType::hasRegisteredConverterFunction(metaType, QMetaType::fromType()))
+ QMetaType::registerConverterFunction(conv, metaType, QMetaType::fromType());
if constexpr(isQtEnum0OrFlag1!=1){
- QMetaType::registerConverterFunction(conv, metaType, QMetaType::fromType());
+ if(!QMetaType::hasRegisteredConverterFunction(metaType, QMetaType::fromType()))
+ QMetaType::registerConverterFunction(conv, metaType, QMetaType::fromType());
}
auto iconv = [](const void *src, void *target) -> bool {
if(src){
@@ -3357,10 +3361,14 @@ int qtjambi_register_enum_meta_type(JNIEnv *env, jclass clazz, const QString& ja
}
return true;
};
- QMetaType::registerConverterFunction(iconv, metaType, QMetaType::fromType::Signed>());
- QMetaType::registerConverterFunction(iconv, metaType, QMetaType::fromType::Unsigned>());
- QMetaType::registerConverterFunction(iconv, QMetaType::fromType::Signed>(), metaType);
- QMetaType::registerConverterFunction(iconv, QMetaType::fromType::Unsigned>(), metaType);
+ if(!QMetaType::hasRegisteredConverterFunction(metaType, QMetaType::fromType::Signed>()))
+ QMetaType::registerConverterFunction(iconv, metaType, QMetaType::fromType::Signed>());
+ if(!QMetaType::hasRegisteredConverterFunction(metaType, QMetaType::fromType::Unsigned>()))
+ QMetaType::registerConverterFunction(iconv, metaType, QMetaType::fromType::Unsigned>());
+ if(!QMetaType::hasRegisteredConverterFunction(QMetaType::fromType::Signed>(), metaType))
+ QMetaType::registerConverterFunction(iconv, QMetaType::fromType::Signed>(), metaType);
+ if(!QMetaType::hasRegisteredConverterFunction(QMetaType::fromType::Unsigned>(), metaType))
+ QMetaType::registerConverterFunction(iconv, QMetaType::fromType::Unsigned>(), metaType);
registerJavaClassForCustomMetaType(env, metaType, clazz);
return result;
}
@@ -3857,37 +3865,41 @@ int registerMetaType(JNIEnv *env, jclass clazz, jboolean isPointer, jboolean isR
}
QMetaType metaType(metaTypeInterface);
int result = metaType.id();
- QMetaType::registerConverterFunction([](const void *src, void *target) -> bool {
- if(src){
- new (target)JObjectWrapper(*reinterpret_cast(src));
- }else{
- new (target)JObjectWrapper();
- }
- return true;
- }, metaType, QMetaType::fromType());
- QMetaType::registerConverterFunction([metaType](const void *src, void *target) -> bool {
- if(src){
- jobject value = reinterpret_cast(src)->object();
- if(value!=nullptr){
- if(JniEnvironment env{200}){
- const JObjectValueWrapperPrivate* methods{nullptr};
- {
- QReadLocker locker(gLock());
- if(gMetaTypeInterfaces->contains(QMetaType(metaType).iface()))
- methods = &(*gMetaTypeInterfaces)[QMetaType(metaType).iface()];
- }
- if(!methods || !env->IsInstanceOf(value, methods->clazz))
+ if(!QMetaType::hasRegisteredConverterFunction(metaType, QMetaType::fromType())){
+ QMetaType::registerConverterFunction([](const void *src, void *target) -> bool {
+ if(src){
+ new (target)JObjectWrapper(*reinterpret_cast(src));
+ }else{
+ new (target)JObjectWrapper();
+ }
+ return true;
+ }, metaType, QMetaType::fromType());
+ }
+ if(!QMetaType::hasRegisteredConverterFunction(QMetaType::fromType(), metaType)){
+ QMetaType::registerConverterFunction([metaType](const void *src, void *target) -> bool {
+ if(src){
+ jobject value = reinterpret_cast(src)->object();
+ if(value!=nullptr){
+ if(JniEnvironment env{200}){
+ const JObjectValueWrapperPrivate* methods{nullptr};
+ {
+ QReadLocker locker(gLock());
+ if(gMetaTypeInterfaces->contains(QMetaType(metaType).iface()))
+ methods = &(*gMetaTypeInterfaces)[QMetaType(metaType).iface()];
+ }
+ if(!methods || !env->IsInstanceOf(value, methods->clazz))
+ return false;
+ new (target)JObjectValueWrapper(JObjectValueWrapper::create(env, *reinterpret_cast(src), metaType));
+ return true;
+ }else{
return false;
- new (target)JObjectValueWrapper(JObjectValueWrapper::create(env, *reinterpret_cast(src), metaType));
- return true;
- }else{
- return false;
+ }
}
}
- }
- new (target)JObjectValueWrapper();
- return true;
- }, QMetaType::fromType(), metaType);
+ new (target)JObjectValueWrapper();
+ return true;
+ }, QMetaType::fromType(), metaType);
+ }
registerConverterVariant(env, metaType, QLatin1String(metaTypeInterface->name), javaClassName, clazz);
registerJavaClassForCustomMetaType(env, metaType, clazz);
return result;
@@ -3919,30 +3931,34 @@ int registerMetaType(JNIEnv *env, jclass clazz, jboolean isPointer, jboolean isR
nullptr, &findWrappersMetaObject);
int result = metaType.id();
registerJavaClassForCustomMetaType(env, metaType, clazz, true);
- QMetaType::registerConverterFunction([](const void *src, void *target) -> bool {
- if(src){
- new (target)JObjectWrapper(*reinterpret_cast(src));
- }else{
- new (target)JObjectWrapper();
- }
- return true;
- }, metaType, QMetaType::fromType