tags:

views:

89

answers:

2

Hi everybody:

I'm trying to create a Qt main windows from Java using JNI directly and I got a threading error.

My code looks like this:

Test class:

public class Test
{
    public static void main(String... args)
    {
        System.out.println(System.getProperty("java.library.path"));
        TestWindow f = new TestWindow();
        f.show();
    }
}

TestWindow class:

public class TestWindow
{
static { System.loadLibrary("mylib"); }

public native void show();
}

C++ impl:

void JNICALL Java_testpackage_TestWindow_show
  (JNIEnv *, jobject)
{
    int c = 0; char** a = NULL;
    QApplication* app = new QApplication(c, a);
    QMainWindow* mw = new QMainWindow();
    mw->setWindowTitle("Hello");
    mw->setGeometry(150, 150, 400, 300);
    mw->show();
    QApplication::exec();
}

and I get my window painted but frozen (it does not receive any event) and the following error message when instantiating the QMainWindow object:

QCoreApplication::sendPostedEvents: Cannot send posted events for objects in another thread

I know all the UI operations must done in the UI thread but in my example I created the QApplication in the only thread I have running, so, everything should work properly.

I did some tests executing the code of my "show" method from a QMetaObject::invokeMethod stuff using Qt::QueuedConnection but nothing works properly.

I know I could use Jambi... but I know that it could be done natively too and that is what I want to do :)

Any ideas on this? Thanks in advance!

Ernesto

+1  A: 

Just a suggestion*: may be you should instantiate a native window in a separate thread?

public class Test
{
    public static void main(String... args)
    {
        System.out.println(System.getProperty("java.library.path"));
        new Thread(new Runnable() {
            public void run() {
                TestWindow f = new TestWindow();
                f.show();
            }
        }).start();
    }
}

*I've never programmed Java apps with native GUI. May be you should consider Swing or SWF instead?

Another suggestion is to try JNA instead of JNI: https://jna.dev.java.net/

Andrew
A: 

The solution was very naïve:

I did not know that I needed to start the jvm with the parameter:

-XstartOnFirstThread

I did it and everything worked properly.

ebasconp