से जेएनआई का उपयोग करके एक स्विंग विंडो बनाना मैं एक स्थिर जावा विधि का आह्वान करने के लिए जेएनआई का उपयोग कर रहा हूं जो बदले में स्विंग जेएफआरएएम बनाता है और इसे प्रदर्शित करता है। कोड काफी सरल है, और जावा-कोड स्टैंडअलोन काम कर रहा है (यानी java StartAWT
जो करता है वह करता है) जबकि जब जेएनआई का उपयोग कर सी से कहा जाता है तो प्रक्रिया लटकती है।जावा जेएनआई: सी
मै मैक ओएस एक्स 10.8 माउंटेन शेर पर जेडीके 1.7.0_09 का उपयोग कर रहा हूं।
JavaVM* jvm;
JNIEnv* env = create_vm(&jvm);
jclass class = (*env)->FindClass(env, "StartAWT");
jmethodID method = (*env)->GetStaticMethodID(env, class, "run", "()V");
(*env)->CallStaticVoidMethod(env, class, method);
(*jvm)->DestroyJavaVM(jvm);
StartAWT
वर्ग इस तरह दिखता है:
public class StartAWT {
public static class Starter implements Runnable {
public void run() {
System.out.println("Runnning on AWT Queue.");
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("That's a frame!");
JLabel label = new JLabel("A Label");
frame.getContentPane().add(label);
frame.pack();
frame.setVisible(true);
}
}
public static class GUI implements Runnable {
public void run() {
try {
System.out.println("Going to put something on the AWT queue.");
SwingUtilities.invokeAndWait(new Starter());
} catch (Exception exc) {
throw new RuntimeException(exc);
}
}
}
public static void run() {
Thread gui = new Thread(new GUI());
gui.start();
}
}
जब मैं आवेदन शुरू, मैं Going to put something on the AWT queue
देख पा रहे हैं
इस सी कोड मैं स्थिर विधि आह्वान करने के लिए उपयोग कर रहा हूँ है लेकिन Running on AWT Queue
नहीं।
मेरा मानना है कि मेरी सी प्रक्रिया के अंदर वर्चुअल मशीन में एडब्ल्यूटी इवेंट कतार नहीं है लेकिन मुझे नहीं पता कि इसे एक या तो रखने के लिए इसे कैसे सेट अप किया जाए (न ही मुझे यकीन है कि यह कारण है)।
जेएनआई का उपयोग कर एडब्ल्यूटी आधारित जीयूआई दिखाने के लिए क्या किया जाना है?
-
संपादित करें: मैं डाला है जो धागे जीवित हैं और नहीं (this gist में देखा जा सकता) कर रहे हैं जो देखने के लिए लूप। इस संस्करण में मैं SwingUtilities.invokeAndWait
का अन्य थ्रेड में आमंत्रण करता हूं। नतीजा: मुख्य धागा जीवित है (सी)। जावा (मुख्य धागा नहीं) द्वारा प्रेषित पहला धागा जीवित है; कॉल invokeAndWait
कॉल करने वाला धागा अवरुद्ध है (मुझे नहीं लगता कि invokeAndWait भी वापस आ गया है), इवेंटक्यूयू पर चलने वाला फ़ंक्शन भी दर्ज नहीं किया गया है।
मैं भी सीधे SwingUtilities.invokeAndWait
लागू है, जो निम्न संदेश दे देंगे की कोशिश की है:
2013-02-02 13:50:23.629 swing[1883:707] Cocoa AWT: Apple AWT Java VM was loaded on first thread -- can't start AWT. (
0 liblwawt.dylib 0x0000000117e87ad0 JNI_OnLoad + 468
1 libjava.dylib 0x00000001026076f1 Java_java_lang_ClassLoader_00024NativeLibrary_load + 207
2 ??? 0x000000010265af90 0x0 + 4335185808
)
यह भी है कि मैं क्या अन्य प्रश्न में StackOverflow पर यहाँ पढ़ा है, जैसे एक टिप्पणी में सुझाव दिया है नीचे। हालांकि, मुझे मूल समस्या का हल नहीं मिला। हो सकता है कि यह ध्यान देने योग्य है कि उपर्युक्त संदेश आने के बाद मुख्य धागा अभी भी जिंदा है, यानी न तो प्रक्रिया डेडलॉक और न ही क्रैश।
-
संपादित करें: मैं अपेक्षा के अनुरूप है, जहां यह काम कर रहा है लिनक्स पर कोड का परीक्षण किया। तो मेरा मानना है कि यह कोको एडब्ल्यूटी के साथ एक मैक ओएस एक्स मुद्दा है, लेकिन मुझे नहीं पता कि इसे कैसे रोकें।
-
संपादित करें: मैं भी एक नया देशी धागा पर JVM के पूरे मंगलाचरण चलती की कोशिश की। यह एप्पल जावा 32-बिट (1.6.0_37) के साथ मैक ओएस एक्स 10.6 पर काम करता है, लेकिन ऊपर वर्णित अनुसार उसी डेडलॉक में परिणाम मिलता है। मैक ओएस एक्स 10.8 पर यह बदतर है, एप्लिकेशन एकमात्र संदेश "ट्रेस/बीपीटी जाल: 5" (जो seems to be related to loading dynamic libraries) से मेल खाता है।
मैं भी वर्णित in this Q&A के रूप में द्विआधारी bundling कोशिश की, लेकिन प्रक्षेपण के संदेश lsopenurlswithrole() failed with the message -10810
है, जो एक अज्ञात त्रुटि है, सेब Launch Services Reference के अनुसार के साथ विफल रहता है। उत्तरार्द्ध एडब्ल्यूटी का उपयोग किए बिना भी होता है (केवल जेवीएम आमंत्रण विफल रहता है)।
भी देखें इस [क्यू एंड ए] (http://stackoverflow.com/q/8750690/230513)। – trashgod
धन्यवाद, मैंने उस प्रश्नोत्तर की जांच की है और मेरे आवेदन के साथ खेला है; लेकिन यह सब के बाद काम नहीं करता है (जैसा कि दूसरे प्रश्न में, वहां कोई समाधान भी नहीं दिया गया है)। – scravy
मुझे एक समान परिणाम मिला; मैं बस 'JavaAplicationStub' का उपयोग करता हूं, लेकिन मुझे नहीं पता कि यह कैसे काम करता है। मुझे आश्चर्य है अगर 'JVM TI', उद्धृत [यहां] (http://stackoverflow.com/a/14492574/230513), प्रासंगिक कुछ भी नहीं है। – trashgod