Hi,

I had posted a while back about wrapping the Poppler PDF library using QT 
Jambi, so that 
it could be used from Java. Although Poppler uses C++ Namespaces, I wrapped the 
3 or 4 
functions that I wanted in my own class, used the Jambi Generator and 
everything was 
great. At the time, it was mentioned that better Namespace support was coming 
with 4.4 so 
I figured I would wait until then to "properly" wrap the entire library 
(without having to 
also write my own C++ classes to wrap ever Poppler class that I wanted).

Anyway, I've now set out to write my own JNI code to do what I want, instead of 
using the 
Jambi Generator. Everything was working nicely until trying to transfer a 
QImage from C++ 
to a Java/Jambi QImage. Back in February, Gunnar suggested stealing some logic 
from the 
generated Jambi code, in particular QPixmap::toImage():
     jobject jimg =
         qtjambi_from_object(env,
                             &image,
                             "QImage",
                             "com/trolltech/qt/gui/",
                             true);

This works -- almost. I get back a valid Java QImage object 
(System.err.println(image) 
prints something like [EMAIL PROTECTED]) but when I try to do anything 
with it (like call image.width()), the JVM crashes.

Now, the image object (QImage) that I'm getting back is on the stack (hence the 
address-of 
&). If I make a copy of it on the heap (QImage *copy = new QImage(image)) and 
then pass 
that copy pointer directly to the qtjambi_from_object function (i.e. no 
address-of 
operator & since it is naturally a pointer) then it doesn't crash -- so long as 
I don't 
delete the copy pointer (which makes that a big memory leak). (creating a copy, 
not 
deleting it, but using the original &image in qtjambi_from_object DOES crash 
the JVM (weird)).

Something else that is weird (though this may be a red-herring, i.e. luck) if I 
construct 
more than 1 QImage (in Java, i.e. QImage i1 = page.renderToImage(); QImage i2 = 
page.renderToImage();) calling i1.width() crashes the JVM but i2.width() does 
not! (i1 
being the first QImage created this way) In fact, just the line "new 
QPixmap().toImage()" 
seems to prevent a crash. Through some trial and error, I tried inlining a 
bunch of the 
code from qtjambi_from_object and it seems that just calling the following one 
line before 
calling qtjambi_from_object prevents a crash:
resolveClass(env, className, packageName);

Thoughts?

Thanks,

-Adam Batkin

_______________________________________________
Qt-jambi-interest mailing list
[email protected]
http://lists.trolltech.com/mailman/listinfo/qt-jambi-interest

Reply via email to