Eldar Insafutdinov Wrote:

> Hello everybody.
> I started working on the QtD API part that deals with containers. And I need 
> your advice. There are 2 possible implementations that I consider. First one 
> is how it is done in QtJambi and I suspect that many other Qt bindings follow 
> it.
> 
> // C++ part of the wrapper
> // binding QList<QObject *> QObject::children() const
> extern "C" Q_DECL_EXPORT jobject JNICALL 
> QTJAMBI_FUNCTION_PREFIX(Java_com_trolltech_qt_core_QObject__1_1qt_1children__J)
> (JNIEnv *__jni_env,
>  jobject,
>  jlong __this_nativeId)
> {
>     QtJambiShell_QObject *__qt_this = (QtJambiShell_QObject *) 
> qtjambi_from_jlong(__this_nativeId);
>     
>     // ------calling the function itself
>     const QList<QObject* >&  __qt_return_value = __qt_this->children();
> 
>     // ------ iterating through the result and populating newly created Java 
> container via JNI
>     // ------ with converted values
>     jobject __java_return_value = qtjambi_arraylist_new(__jni_env, 
> __qt_return_value.size());
>     QList<QObject* > ::const_iterator __qt_return_value_end_it = 
> __qt_return_value.constEnd();
>     for (QList<QObject* > ::const_iterator __qt_return_value_it = 
> __qt_return_value.constBegin(); __qt_return_value_it != 
> __qt_return_value_end_it; ++__qt_return_value_it) {
>         QObject*  __qt_tmp = *__qt_return_value_it;
>         jobject __java_tmp = qtjambi_from_qobject(__jni_env, (QObject *) 
> __qt_tmp, "QObject", "com/trolltech/qt/core/");
>         qtjambi_collection_add(__jni_env, __java_return_value, __java_tmp);
>     }
> 
>     return __java_return_value;
> }
> 
> JNI code is a bit messy but I tried to explain the idea. In our case we will 
> create a D array and fill it with marshalled values. That's relatively easy 
> to implement. But most of people I talked about this to don't like it, 
> because it is slow. I personally didn't write a lot of Qt code yet and I 
> don't know if calling methods dealing with containers is going to be 
> intensive or not.
> People want to directly bind to QVector and QList. I have now idea how to do 
> this, because they are templated types and therefore you have to bind to 
> every template instantiation. Is it possible to recreate them using struct in 
> D and use it natively? I think people here have experience with STL (don't 
> think Qt containers bring lots of new things, except a different API style 
> probably).

Max Samukha suggested a nice idea that we can wrap each instantiation 
separately(not extremely many of them). And that's actually the case in C# 
bindings. I will try to investigate how they work.

Reply via email to