2010-05-17 31 views
1

我試圖直接使用JNI從Java創建Qt主窗口,並且出現了線程錯誤。使用JNI從Java創建QMainWindow

我的代碼如下所示:

測試類:

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

TestWindow類:

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(); 
} 

,我讓我的窗口繪但凍結(它不會收到任何事件)和實例QMainWindow的對象時出現以下錯誤信息:

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

我知道所有的UI操作必須在UI線程中完成的,但在我的例子中,我在我所運行的唯一線程創建的QApplication,所以,一切都應該正常工作。

我做了一些測試,使用Qt :: QueuedConnection從QMetaObject :: invokeMethod中執行我的「show」方法的代碼,但沒有任何工作正常。

我知道我可以使用的佔碑......但我知道,它可能本身也做了,這就是我想要做的:)

在這個任何想法?提前致謝!

埃內斯托

回答

0

的解決方案是很天真:

我不知道我需要開始與參數的JVM:

-XstartOnFirstThread 

我做到了,一切正常。

1

只是一個建議*:可能是你應該在一個單獨的線程實例化一個本地窗口?

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(); 
    } 
} 

*我從來沒有用本地GUI編寫Java應用程序。可能你應該考慮Swing或SWF呢?

另一個建議是嘗試,而不是JNI JNA:https://github.com/twall/jna/